b站学习记录一下,原视频地址:2020年7月最新Java面试题总结精讲视频合集_哔哩哔哩_bilibili
- 如何判断某个对象是‘垃圾’
- 可达性分析法:通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
- 可达性分析法:通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
- 流程
- 对象首先存储到年轻代的Eden(伊甸园)区,当Eden区满了之后会进行gc(minor gc)垃圾回收,存活的对象存储到Survivor区。并为对象分代年龄+1(存储到对象头中),
- 再次进行gc,会扫描整个年轻代,也就是Eden+Survivor。此时存活的对象会复制到空的Survivor区,清空之前的Eden+Survivor区域,同时分代年龄+1。
- 当对象量过大,超过Survivor存储量 或者 分代年龄 =15 的时候,会把对象存储到老年代。
- full GC
-
发生Young GC之前进行检查,如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象总和的平均大小”,说明本次Young GC后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,此时会触发FullGC
-
当老年代没有足够空间存放对象时,会触发一次FullGC
-
如果元空间区域的内存达到了所设定的阈值-XX:MetaspaceSize=,也会触发FullGC。
- gc进行时都会进行STW,FullGC会时间更长一些 ,会停止用户线程,用户会有感知,比如卡顿。
- 如果老年代放满 就会OOM
-
- STW(stop the word)
- 为什么要设计STW?
- 因为如果不停止线程,线程继续执行,执行结束后,栈中数据被释放,对象指针也被释放, 导致可达性分析判断都变成了垃圾对象。
- 停止后,对象的状态不在变化,是垃圾就是垃圾,不是就不是,不用重复gc
- 为什么要设计STW?
- 能否对jvm进行调优,让其几乎不发生Full Gc
- 根据业务场景时间情况来看,调节各区大小,比如避免同一时间进入内存大于Survivor的一半 进行对象动态年龄判断机制,提早进入老年代,进行Full gc。
- 对象头:
- 对象不只是存储实例数据,还存储了对象头数据,对象头中存储了如锁状态,分代年龄等信息
个人理解,如有不对,请指出交流。
参考:原文链接:https://blog.csdn.net/weixin_31967551/article/details/114801294