1.Java中判断是否是垃圾的算法
可达性算法
循环引用问题:引用计数算法
什么样的节点可以作为GC ROOTS (面试问到概率并不大)
2.finalize方法
对象的自我拯救 : 当对象由可达变为不可达时,先变成可恢复状态,此时就 (可能) 会调用finalize 方法
可能:1.子类必须重写该方法
2.该方法至多只能被执行一次
且满足以上两个情况 --> 底层的finalier 线程执行的情况
3.堆
年轻代 : eden , to survivor , from survivor 8 :1 :1
年老代 :1: 2 一共三分
永久带
jvm规范的问题
方法区逻辑上是属于堆的, 但是在实现时,又有个别名叫no-heap
JVM 大小是一个区间 --> 初始大小 --> 最大使用大小
在实际开发过程中通常都是调节成一样的,避免不必要的资源浪费
通常(依据各公司实际情况而定):调节成3/4
Java中的四种引用
1.强引用 : 平时写的代码 new
2.软引用 : 当内存不足发生gc 后,将软引用自动断开,当内存足够时,此时就当成普通引用来使用
3.弱引用 :一旦发生GC时就会被回收无论内存是否够用
4.虚引用 :为每一个对象设置虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知
重點:
年轻代 :复制清除算法
- new 出来的对象都是存放于 eden区,当eden区满了,此时触发gc-> 将eden区中不是垃圾的内容移动到s0区,再一锅端清除eden区中的内容,当s0区满了,此时会将s0区不是垃圾的内容移动到s1区,再将s0区的垃圾回收(一锅端), s0->s1 如此反复15 次后,如果这个对象还依然存活-> 此时表明这个对象非常坚挺 ->将这个对象移动到年老代
- 分配担保原则: 当年轻代销毁垃圾的速度 赶不上生产垃圾的速度,那么此时会触发分配担保原则->将对象移动到年老代
- 优缺点
- 速度快(自身决定)
- 没有内存碎片
- 速度快(自身决定)
- 优缺点
- 分配担保原则: 当年轻代销毁垃圾的速度 赶不上生产垃圾的速度,那么此时会触发分配担保原则->将对象移动到年老代
年老代: 标记清除 标记整理 / 标记压缩
标记算法: 两步:1.标记垃圾 2.清理垃圾
缺点
1.内存不连续
2.慢
标记整理/ 标记压缩算法:标记不是存活的对象,一次性服务到位 ,把它按照连续的顺序排列好,再将其他对象回收
优缺点:
优点:内存连续
缺点:自身对象特征造成,速度慢