课程名称:笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机
课程章节:第6章 JVM原理篇
主讲老师:求老仙
课程内容:
第6章 JVM原理篇
课程收获:
####1, gc清除算法?
- 引用计数:对象被引用的次数,来确定这个对象用不用回收,例如:有两个引用,就是
**引用计数问题,循环引用,**对象被创建引用次数就是1,为1表示没有再被引用,但是不能被回收,因为已经被循环引用
2,标记-清除(双色标记),未被标记的会被清除
从根出发,依次遍历可以找到的对象,若能找到就不回收。(根一般是方法区的静态变量,或这是对象的引用等)
如何解决循环引用的问题,可以使用set集合,将所有元素放入到集合中如果有相等的元素,就是有环,或者通过,快慢指针
双色(标记-清除)算法的问题,标记阶段新增了节点:从root出发,mark线程标记了,A-B,但是另外一个线程新增了个C,就需要重新标记。从C开始重新标记。
-
gc用的最多的是,三色标记法,解决双色标记中出现新增节点的情况
三色标记算法,用一个灰色,表示未完成mark的标记。
可以用黑色,白色,灰色,三个颜色表示,标记,未标记,未完成标记的三种状态。
过程:先从root开始,到A-B-C
没有被标记的节点,jvm是如何清除的,jvm是可以看到没有被标记的节点,实际上是通过双向链表来实现的,这样就可以找到未被标记的节点
什么时候整理,什么时候复制?Jvm的分区?
分区:Eden-> survivor form -> survivor to -> old
标记-复制算法
标记-清除算法
标记-整理算法
为什么要整理:因为标记-清除算法,产生了内存碎片,所以要进行整理。
为什么要复制:标记整理算法,比较慢,所以使用标记复制
jvm****分区:eden区和survivor区,设置eden和survivor的大小比值:survivorRatio默认:1:8
各个区域的内存划分大小?
按照GC分代手机角度划分
老年代:2/3的堆空间
年轻代:1/3的堆空间
eden区:8/10 的年轻代
survivor0: 1/10 的年轻代
survivor1:1/10的年轻代
元数据区域
元数据区域取代了1.7版本及以前的永久代。元数据和永久代本质上都时方法区的实现。方法区皴法虚拟机加载的类型西,静态变量,常量数据。
参数设置:-XX:MetaspaceSize=18m
-XX:MaxMetaspaceSize=60m
直接内存
java.nio 中使用DirectBuffer相关使用