JVM之垃圾回收机制

一、常量池的位置

 方法区和永久代以及元空间是什么关系呢? 方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。并且,永久代是 JDK 1.8 之前的方法区实现,JDK 1.8 及以后方法区的实现变成了元空间

二、 堆的结构

演变

 

永久代中存启动类依赖的java类,不存在垃圾回收,关闭jvm才会回收内存。 

打印堆结构

-XX:+PrintGCDetails

三、堆中存放对象的规则 

1. 对象优先分配在Eden伊甸园区,如果Eden没有空间了会发动一次Minor GC。

2.大对象会优先存放在老年代,目的是减少垃圾回收的成本。实际上大对象存放在老年区是由jvm参数动态决定的。

G1回收器中:

-XX:G1HeapRegionSize //设置堆区域的大小
-XX:G1MixedGCLiveThresholdPercent//设置阈值绝对对象直接进入老年代

3.长期存活的对象将进入老年代

一般情况下,对象在刚诞生时会引入Eden区,在经历一次Minor GC后如果仍然可以存活将进入幸存区,并设置对象的年龄为1。对象每熬过一次MinorGC后年龄就增加1。

hotspot将所有对象的年龄从小到大进行排序,并将年龄进行加和,当加到某个对象年龄后,超过幸存区所有对象年龄和的50%时(这个百分比可以自设)。取这个对象的年龄和设置的晋升老年代年龄的阈值取其小的一个作为新的晋升老年代阈值。

设置幸存区晋升老年区阈值:

-XX:MaxTenuringThreshold

设置晋升老年代。幸存区对象年龄超过的百分比

-XX:TargetSurvivorRatio=percent

四、那些对象可以回收?

1.引用计数法

为每个对象分配一个计数器,当有引用时,计数器+1。当引用失效时,计数器-1。当计数器为0时,说明这个对象就是垃圾了。

局限:对象如果循环引用,计数器就永远不是0.

2.可达性分析算法

通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。

哪些对象可以作为 GC Roots 呢?

  • 虚拟机栈(栈帧中的局部变量表)中引用的对象
  • 本地方法栈(Native 方法)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 所有被同步锁持有的对象
  • JNI(Java Native Interface)引用的对象

 被确定为可回收的对象“非死不可”吗?

被判定为垃圾的对象还要经历两次标记才会被回收,第一次标记:可达性算法判定不可达。还有进行一次条件判断和一次筛选。当这个对象没有覆盖finalize 方法,或者已经调用过了finalize 方法时,虚拟机判断没有必要执行finalize 方法。第二次标记:除非待回收的对象和引用链上的对象关联,否则就会被回收。

五、怎么进行回收?(算法)

1.标记清除算法

标记出不需要回收的对象(根据可达性分析),将没有标记的对象进行回收。

问题:标记清除这个过程效率不高;会产生大量的内存碎片。

2.复制算法

将内存分成两块,只使用一半。将使用的一半中保留的对象复制到没使用的那一半。然后清空使用着的这一块。

问题:可用内存空间变小,对于存活对象数量的的老年代不适合(成本高效率低)。

3.标记整理算法

适合老年代,现将对象标记,然后将存活的对象向一端移动,并将界限以外的对象清理掉。

4.分代收集算法:

现代的虚拟机多采用分代收集算法,按照新生代和老年代的特点选择合适的回收算法。例如新生代存在大量的垃圾回收,因此采用复制算法。老年代因为没有额外的内存空间分配担保,采用标记清除算法或者标记整理算法。


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在mysql函数中启动事物和行锁/悲观锁实现并发条件下获得唯一流水号

业务场景 我有一个业务需求:我有一个报卡表 report里面有一个登记号字段 fcardno、地区代码 faddrno和发病年份 fyear,登记号由**“4位地区代码”“00”“发病年份”“5位流水号”**组成,我要在每次插入一张报卡(每一行数据&#…

布局香港之零售中小企篇 | 传承之味,迈向数字化经营的时代

随着内地与香港两地经贸合作日渐紧密,越来越多内地消费品牌将目光投向香港这片充满机遇的热土,纷纷入驻香港市场。「北店南下」蔚然成风,其中不乏已在内地市场深耕多年的传统老字号。数字化经营时代,老字号焕新刻不容缓&#xff0…

系统服务控制

系统服务控制 格式:systemctl 控制类型 服务名称 控制类型 start:启动stop:停止restart:重新启动reload:重新加载status :查看服务状态 例: systemctl status firewalld //显示防火墙状态 systemctl stop firewalld.service //关闭防火墙…

Linux驱动开发——(二)pinctrl和gpio子系统

目录 一、简介 二、修改设备树 2.1 添加pinctrl节点 2.2 添加LED设备节点 2.3 检查PIN是否被其他外设使用 三、驱动代码 四、平台实验测试 一、简介 pinctrl子系统简单来说就是用来配置PIN的复用和电气属性。 对于使用者来讲,只需要在设备树里面设置好某个p…

【电路笔记】-数字逻辑门总结

数字逻辑门总结 文章目录 数字逻辑门总结1、概述2、逻辑门真值表3、总结 数字逻辑门有三种基本类型:与门、或门和非门。 1、概述 我们还看到,数字逻辑门具有与其相反或互补的形式,分别为“与非门”、“或非门”和“缓冲器”,并且…

android 创建module

文章目的: 快速创建module并使用 创建步骤: 1 创建module 2 修改module下的build.gradle文件 3 修改清单文件中MainActivity属性,否则APP会因为有多个启动界面而崩溃 4 在主项目build.gradle引用该object Module 至此,可在APP中…

MTK MFNR 学习笔记

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、MFNR 简介二、MFNR 开关与决策三、MFNR 相关的adb 命令四、MFNR log 分析五 参考文献 一、MFNR 简介 MFNR : Multiple Frame Noise ReductionMFLL …

决策树分类器(保姆级教学) 定义+特性+原理及公式+鸢尾花分类经典问题示例(完整Python代码带详细注释、保姆级分部代码解释及结果说明、决策树可视化及解释)

文章目录 引言定义特性基本原理和公式理解信息增益(ID3算法)熵的定义条件熵信息增益的计算 基尼不纯度(CART算法)基尼不纯度的定义基尼不纯度的计算例子 实现步骤解决鸢尾花分类问题(机器学习入门中的经典案例Python代…

电商平台业务及架构演变史

不少人认为电商系统很简单,因为现在做电商的太多了,看到的电商产品也多。看来看去产品都差不多,没什么特别。 其实中国电商发展已有20多年历史,电商以销售为核心连接着研、产、供、销、服整套的信息系统体系。其中的设计并没有那…

Yoshua Bengio独家专访:我不想把大模型未来押注在Scaling Law上,AGI路上要“注意安全”...

导读 漫长的30年间,数度从主流方向的超然出走,是Bengio的制胜秘诀。这种不盲从主流的风格体现在他研究生涯的方方面面。 90年代末期,神经网络被打入冷宫,Bengio的论文多次遭拒,连学生们也开始担心,和他一起…

transformer架构详细详解

一、transformer的贡献 transformer架构的贡献:该架构只使用自注意力机制,没有使用RNN或卷积网络。且可以实现并行计算,加快模型训练速度。 (将所有的循环层全部换成:multi-headed self-attention) 二、t…

linux启动minicom、u-boot的常用命令、网络命令tftp、nfs/根文件系统、u-boot的bootargs环境变量

linux启动minicom sudo minicom -con进入minicom界面: 打开单片机 在打开之后,我们通过 printenv查看环境配置 在修改配置之前,我们最好先将环境初始化一下,初始化代码为 nand erase.chipu-boot的常用命令 尽管u-boot是一个…