JVM内存回收机制

news2024/10/5 2:39:34

目录

1.JVM运行时数据区

2.JVM类加载过程

3.双清委派模型

4.垃圾回收机制(GC)

找出谁是垃圾方案一:引用计数

找出谁是垃圾:方案二,可达性分析

释放垃圾的内存空间

判断垃圾:jvm依据对象的年龄对 对象进行区域划分。

回收垃圾方式:分代回收


1.JVM运行时数据区

JVM运行时数据区域 也叫做:JVM内存布局。

JVM内存布局 和 java内存模型完全不同,JVM内存布局由5大部分组成。

1.堆区(线程共享):程序中所有创建的对象都保存在堆中。JVM最大空间。

2.栈(线程私有)

        1>.java虚拟机栈作用(线程私有):Java虚拟机栈的生命周期 和 线程相同Java虚拟机栈描述了java方法执行的内存模型每个方法在执行时 都会创建一个栈帧,用来储存局部变量方法之间的调用关系动态链接,方法出口等等。

        2>.本地方法栈:与虚拟机栈类似,只不过是给本地方法使用的,本地方法由C++代码编写。

3.程序计数器(线程私有)保存下一条要执行的指令的地址。这里不是CPU寄存器储存的,而是内存空间,指令是java的字节码。不是二进制机器语言。

4.元数据区:(以前叫方法区)保存java代码中涉及类的相关信息。类的static属性。

在一个java进程中,元数据区 和 堆 是只有一份的。即同一个进程中的所有线程共用一份数据

一个java进程中有多个线程,多个线程都有自己的 程序计数器 和 栈。所以每个线程都需要保存自己的“程序计数器” 每个线程都需要记录自己的 调用关系。

检测一下是掌握的怎么样,下面代码中的变量都储存在哪些区域?

public class test4 {
    static class  Test{
        private int a;
        private Test b = new Test();
        private static int c;
        private static Test d = new Test();
    }

    public static void main(String[] args) {
        int e = 10;
        Test f = new Test();
    }
}

一般地:

局部变量:栈

成员变量:堆

静态成员变量:元数据区(方法区)


2.JVM类加载过程

一个类的生命周期大致为下几个过程。

编写一个java程序 会得到一个 .java文件,在经过javac 编译 就会得到一个 .class文件。

想要运行java 进程,jvm就需要 读取 .class 文件并执行里面的指令。

jvm读取到 .class里面的内容 这个就是类加载。把类 涉及的字节码,从硬盘读取到 内存里。

 加载一个 .claas文件,就会对应创建一个类对象。类对象包含了.class

文件里的各种信息。

类名字,类的属性,类有哪些方法,继承的父类有哪些,实现的接口有哪些....


具体步骤:

1.加载:把 .class 文件找到,然后打开并读取文件的内容。

代码中先见到 类的名字,然后进一步找到对应的 .class 文件(涉及一系列的目录查找过程

2.验证验证读到的 .class 文件的数据是否正确,是否合法。

java标准文档中明确规定 .class 文件的格式是怎么样的。

3.准备:分配内存空间。

根据读取到的内容大小,确定出类对象需要的内存空间,申请这样大小的空间,并把这个空间全部初始化为0.

4.解析:主要针对类中的字符串常量进行处理

java虚拟机 将字符串常量池中的 符号引用 替换为直接引用的过程,也就是初始化常量。

符号引用 其实就是指(字符串常量已经在 .class文件中)文件中 符号的位置,就是偏移量。

直接引用 就是直接保存变量的地址。

5.初始化:针对 类对象 做最终的初始化操作,执行静态成员赋值语句。


3.双清委派模型

操作: 输入一个 类的全限定名(类似于java.lang.String),的到对应的 .class 文件。

属于 jvm加载类中的第一个机制:加载

Bootstrap ClassLoader(加载 标准库中的类)

ExtensionClassLoader(加载 扩展库的类)

ApplicationClassLoader(负责加载第三方库的类)

 

为什么会是这个流程?

核心目的是 方式用户自己写的类把 标准库 或者 扩展库给覆盖掉。

保证 标准库的类是第一位,扩展库的类的是第二位。最后是第三方库的类。

防止程序员 不小心创建一个 和 系统中已有的类重名的类。导致加载的时候覆盖掉了系统的类。


4.垃圾回收机制(GC)

GC 主要存在哪里呢?

栈 和 程序计数器 主要都是跟随线程的结束而结束。

元数据区:类对象涉及到的类加载,一个程序里面吗要加载得类都是有上限的,不会出现无限增长的情况。

所以 堆是GC得主要战区。

垃圾回收,回收内存 都是一对象为维度进行回收的。

GC回收的流程:1.找出谁是垃圾         2.释放垃圾的内存空间

找出谁是垃圾方案一:引用计数

给每个对象分配一个计数器,衡量有多少个引用指向。

每增加一个引用,计数器+1

每减少一个引用,计数器-1,如果计数器为0,此对象就垃圾了需要回收。

此时 对象中的计数器为0,就视为垃圾,需要回收。

上述方案存在两个问题:

1.消耗额外空间去 储存计数器

假设Tets类,只有一个int(4字节)成员,那么就要花2个字节储存计数器,内存多用了 50%

2.引用计数可能会导致“循环引用”,使得上述判定出错。

这种情况就是最后 这俩对象计数器都不是0,都不能被释放。


找出谁是垃圾:方案二,可达性分析

用时间换取空间。

JVM中专门搞了一波周期性的线程,扫面代码中的所有对象,判定某个对象是否“可达”。

对应的,不可达的就是垃圾。

JVM中有所有对象的总名单,按照名单点名,如果没有到的 ,就是垃圾。

JVM中有很多的root根,从这个root开始可以把所有的对象都遍历到。遍历不到但是名单上存在就是垃圾。


释放垃圾的内存空间

1.标记-清除法

如果直接对内存空间进行标记清楚,就有可能导致碎片化的空间无法充分利用。

这样剩下的三个空间就不容易利用了,碎片化的空间不能进行申请连续的空间。

2.复制算法

将被回收后的空间的一分为二,把不是垃圾的对象拷贝到另一侧。确保回收后得到连续的空间

这个算法缺点很明显:

1.内存空间利用率低

2.如果存活下来的对象比较多,复制成本也很大。

3.标记-整理

与标记-清楚类似,但是不一样的是后续并不是直接回收对象,而是让所有的存活对象都向前移动,最后直接清理掉边界标记的就可以了。


4.jvm中真正的解决方案。

判断垃圾:jvm依据对象的年龄对 对象进行区域划分。

如果获得年龄,使用可达性分析 对对象进行扫描,每次描扫后对象的年龄就+1

1.伊甸区比较大,让新创建的对象存放,大多数新创建的对象都活不过第一轮GC,留下来的对象拷贝到幸存区。

2.幸存区,是两个相按照复制算法将存活久对象复制到幸存区,反复多次。幸存区里也会为了保留完整空间进行左右多次复制。

3.一个对象在幸存区多次被拷贝,年龄不断增长,就要拷贝到老年代了。

4.根据经验规律,老年代的对象生命周期都比较长,即便如此也是要进行可达性分析的。

但是老年代的GC频率较低。老年代也需要通过标记整理。


回收垃圾方式:分代回收

分代回收时JVM的GC基本思想方法。

jvm还提供许多“垃圾回收器”对上述的分代回收 作进一步的扩充和具体实现。

CMS涉及理念,把整个GC过程拆分成多个阶段,能和业务线程并发运行的。就尽量并发减少STW时间。

G1把整个内存分成很多快,不同的颜色表示这个一块区域是哪一块(新生代,老年代,幸存区...)

进行GC时不要求一周期就把多个内存都回收,只要回收一部分就好。限制一轮GC的工作量,目的是使STW控制在一定范围,降低STW的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Zynq SDIO WiFi移植三(支持2.4/5G)

应用问题-WIFI作为AP-hostapd多次连接 设备作为WIFI热点时,连接出现了下述问题: 1 手机连接需要三次,三次都需要输入密码; 2 平板连接需要三次,三次都需要输入密码; 3 电脑连接需要一次,无感…

隧道人员定位UWB双通道定位终端

大家好,我是华星智控小智,今天我给大家介绍我们的UWB双通道定位终端。 双通道定位终端(型号STD)主要用于隧道人员或天车定位,终端基于无线脉冲技术,采用双天线设计,可实现对2路方向的测距定位&a…

实施威胁暴露管理、降低网络风险暴露的最佳实践

随着传统漏洞管理的发展,TEM 解决了因攻击面扩大和安全工具分散而产生的巨大风险。 主动式 TEM 方法优先考虑风险并与现有安全工具无缝集成,使组织能够在威胁被有效利用之前缓解威胁。 为什么威胁暴露管理 (TEM) 在现代网络安全策略中变得至关重要&…

使用模拟和真实的 Elasticsearch 来测试你的 Java 代码

作者:来自 Elastic Piotr Przybyl 在本文中,我们将介绍并解释两种使用 Elasticsearch 作为外部系统依赖项来测试软件的方法。我们将介绍使用模拟测试和集成测试的测试,展示它们之间的一些实际差异,并给出一些关于每种风格的提示。…

嵌入式C语言自我修养:编译链接

源文件生成可执行文件的过程? 源文件经过预处理、编译、汇编、链接生成一个可执行的目标文件。 编译器驱动程序,包括预处理器、编译器、汇编器和链接器。Linux用户可以调用GCC驱动程序来完成整个编译流程。 使用GCC驱动程序将示例程序从ASCII码源文件转换…

如何使用EventChannel

文章目录 1 知识回顾2 示例代码3 经验总结我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。 1 知识回顾 我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种…

仿RabbitMQ实现消息队列服务端(一)

文章目录 交换机数据管理队列数据管理绑定信息(交换机-队列)管理队列消息管理虚拟机管理交换机路由管理队列消费者/订阅者管理 整体框架:工具模块及项目整体模块框架 交换机数据管理 交换机数据管理就是描述了交换机应该有哪些数据 定义交换机数据类 1、交换机的名…

Linux忘记root用户密码怎么重设密码

直接说步骤: 1.重启客户机 2.在选择内核页面快速按e键,进入编辑模式 进入后应该是这个样子 在这里只能按上下键切换行 找到Linux16这里 3.按右方向键切换到行尾,也就是UTF-8处,在后面添加一个空格,然后加上这段话 …

鸿蒙网络管理模块04——网络连接管理

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 1、概述 网络连接管理提供管理网络一些基础能力,包括WiFi/蜂窝/Etherne…

数据库概述(1)

课程主页:Guoliang Li Tsinghua 数据库在计算机系统中的位置 首先,数据库是在设计有大量数据存储需求的软件时必不可少可的基础。 最常见的是:我们通过app或者是浏览器来实现一些特定需求——比如转账、订车票。即引出背后的CS和BS两种网…

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层: 1.1 FM部分(因子分解机层&#…

Epoch、Batch与Iteration简答理解

揭秘神经网络训练的三大神秘要素:Epoch、Batch与Iteration 在探索深度学习的奇妙世界时,你是否曾被Epoch、Batch和Iteration这三个术语搞得晕头转向?别担心,今天我们就来揭开它们的神秘面纱,带你深入了解神经网络训练的奥秘! 一、Epoch:时间的轮回,数据的洗礼 Epoch…

Python | Leetcode Python题解之第454题四数相加II

题目: 题解: class Solution:def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int:countAB collections.Counter(u v for u in A for v in B)ans 0for u in C:for v in D:if -u - v in countAB:ans countAB…

《深度学习》OpenCV 图像拼接 原理、参数解析、案例实现

目录 一、图像拼接 1、直接看案例 图1与图2展示: 合并完结果: 2、什么是图像拼接 3、图像拼接步骤 1)加载图像 2)特征点检测与描述 3)特征点匹配 4)图像配准 5)图像变换和拼接 6&am…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03目录1. A Scalable Data-Driven Framework for Systematic Analysis of SEC 10-K Filings Using Large Language Models摘要研…

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…

有符号整型和无符号整型比较大小,整型提升{9.28下午}

有符号整型和无符号整型比较大小时,会先把有符号整型先转变成无符号整型 -1的补码是32个1,当成无符号整型来处理时,补码就是源码,所以是一个超级大的数 在C语言中,当有符号整型(如int)和无符号…

MATLAB|电气互联系统有功-无功协同优化模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 下载链接 1 主要内容 本程序基本复现《“碳中和”目标下电气互联系统有功-无功协同优化模型》,文献模型提供了一个很好的创新思路,把常规电气互联系统的调度和有功无功优化…

Jmeter中有关属性的获取的问题

Jmeter中有3个方法用来获取属性值: props.getProperty(propName), ${__property(propName)} ${__P(propName)} 试验了下,在JSR223 Sampler中使用以上3个方法获取属性值的情况 1. 返回结果如下: 这里看到,在jmeter属性列表里…

QT学习笔记3.2(建立项目、执行_打包、生成执行文件exe)

QT学习笔记3.2(建立项目、执行_打包、生成执行文件exe) 目录 windeployqt打包过程中: enigma virtual box把所有文件打包成.exe文件 资料 mingw还没有编译成功过,这里说明使用msvc的过程。 使用msvc可以编译生成 1.生成执行文件、库文件…