JVM学习之路

本文深入探讨JVM垃圾回收的触发时机,包括fullGC与MinorGC的区别,以及各种垃圾回收算法如标记清除、复制清除和标记压缩算法的优缺点。同时解析了对象存活判断方法和四种引用类型的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下为JVM部分相关内容,如有瑕疵,还有各位执教!

一、 fullGC 什么时候发生

1、调用system.gc()方法时,系统建议执行fullGC,但不一定会执行

2、年老代的内存不足时

3、永久代的内存不足时 CMS GC时出现promotion failed和concurrent mode failure

4、发生minorGC后,进入年老代的对象平均大小大于年老代可用内存

5、CMS GC时出现promotion failed和concurrent mode failure

1.当年老代发生垃圾回收时(年老代内存不足时),触发FullGC

2.minorGC 在不断产生垃圾时候,可能会出现发了minorGC,年轻代内存依然不足,此时会直接将对方放置到年老代中,(年老代内存不足时),触发FullGC

分配担保原则:

在JVM进行minorGC之前,会先检查年老代的最大可用连续内存是否大于年轻代所有对象总空间,如果条件成立,则minorGC确保是安全的;如果不成立,jvm会查看是否允许担保失败,如果允许就会进行minorGC,如果不允许,则改为进行一次fullGC。

是否允许担保失败:在发生minorGC之后一些对象可能会进入年老代,如果年老代现有的内存空间不足以放下这些将要晋升的对象时,就会触发一次fullGC,给新的对象腾出可用的空间

二、Java中针对垃圾回收的算法
1.标记清除算法 使用gc root的标记方式
1.标记 2.清除
缺点 1.效率低,因为标记和清除都消耗性能
2.会产生内存碎片 -----> 导致提前触发gc
提前出发gc
2.复制清除算法 它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉
注意:专门针对年轻代 ,且存放的对象通常的朝生夕死的对象
1.产生了对象会放置eden,当发生minorGC时,会将eden中存活的对象移动到s0区域中,清除eden区所有内存,此时再出发minorGC,s0会将存活的对象移动到s1区,再清除s0区的所有内存,再s0- s1 - s0 - s1 反复触发默认15次
优点:效率高,没有内存碎片
缺点:浪费了一片内存,在JVM规范中 eden和幸存者区是 1: 1
但是在实际的商业版JVM中的比例是8:1:1
3.整理清除算法(标记压缩算法)
1.针对年老代的算法
优点:不会产生内存碎片
缺点:效率低

   原理:将不是垃圾的对象依次的排列,再将其他位置清除

4.分代算法

三、如何判断一个对象是否是垃圾
答:在jdk1.2以前采用的是引用计数算法
采用的是可达性算法
可达性算法:通过一系列被称为"GC ROOT"的对象作为起始点,从这些节点出发开始向下搜索,搜索过程所走过的路径成为引用链,当一个对象到达GC ROOT时,还没有引用链相连,就说明这个对象是不可达的

四、什么样的对象可以作为GC ROOTS (摘自深入理解Java虚拟机 65页)

  1. 虚拟机栈(栈帧中本地变量表所指向的对象)

2.方法区中类静态属性引用的对象

3.方法区的常量

4.native方法中的引用的对象

五、说说你对MinorGC 和 FullGC的理解
年轻代GC minorGC
年老代GC fullGC

六、Java中的四种引用类型 ,及各自的含义是什么
1.强引用 类似new出来的对象,只要强引用还在,gc就不会回收
2.软引用 当发生gc,且内存不足时,会自动回收这些软引用
3.弱引用 当发生gc,不管内存够不够都会回收弱引用
4.虚引用 在发生GC 时,会受到一个通知

七、堆内存溢出异常且解决方案
答:年轻代内存不足时,会触发minorGC,当发生完minorGC 年轻代内存依然不足时,触发分配
担保原则,将对象直接放置到年老代,当年老代放不下这样的对象或者经常默认15次移动而存活
下来的对象时,此时会触发fullGC ,若触发完fullGC 内存足够时,那么年老代不受到影响,再等
着年轻代将对象放置到年老代,当年老代触发完fullGC 都无法装下年轻代传递过来的对象时,此
时触发内存溢出异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值