
一、对象什么时候可以被垃圾器回收
(1)垃圾回收介绍
垃圾回收主要指的是堆中的对象,而堆作为一个共享的区域,存储着我们创建的对象与数组。但是并不能无限地去创建对象或是让所有对象都永久存在,如果不进行垃圾回收那么就会导致内存被耗尽。

(2)引用计数法


即便此时a与b都被赋值为了null,栈中对象与堆中数据不再有关联,但是因为堆中他们的数据是互相循环引用的,那么此时他们的ref仍会等于1,而并不会变为0,这两个对象也就一直都不会被回收,也就容易导致内存泄露,一般也就不会用其来定位对象是否为垃圾。
(3)可达性分析算法


(4)总结

二、JVM垃圾回收算法有哪些

(1)标记清除算法

数组也是存储到堆当中,并且数组存储的必须是一个连续的内存空间,如果使用了标记清除算法,由于内存不连续,也就可能没有办法再去存储新的数组对象了(或者是存储一个比较大的数组)。
(2)标记整理算法

(3)复制算法

(4)总结

三、分代回收



暂停时间短说明内存回收的效率较高。
在FullGC会一下子清空新生代与老年代区域的所有内存,这种应该尽量避免,一般发生在新生代和老年代内存严重不足的时候。
总结:

四、JVM中有哪些垃圾回收器

(1)串行垃圾回收器

(2)并行垃圾回收器

(3)CMS(并发)垃圾回收器

这个标记就是之前讲过的可达性分析算法来标记哪些对象是存活的对象
(4)总结

五、G1垃圾回收器
(1)介绍

(2)工作流程
①年轻代垃圾回收
- 第一次回收
首先我们把整个堆划分成了大小相等的区域,每个区域都可以作为我们刚才提到的伊甸园Eden、幸存者Survivor、老年代old。
伊甸园Eden在整个堆内存中的占比大约是5%~6%,当超过这个阈值时就会触发垃圾回收。

- 第二次回收

②并发标记
在进行并发标记时无STW,而在并发标记后的重新标记阶段就有STW。

暂停时间目标指的是一个预期的暂停时间,可以人为进行设定,代表线程的暂停时间不能超过多少毫秒。
而回收价值指的是某老年代对象中存活对象的数量越少,回收价值就越高,存活对象少也意味着将来能释放更多内存。而其他老年代对象中因为存活对象比较多,回收后可释放的内存较少,回收价值就比较低了。因此它会挑出一些回收价值比较高的老年代,连同当前的Eden区、幸存者区来做一次垃圾回收。
③混合垃圾回收

混合收集可能会重复执行多次,因为第一次在预定时间内可能回收了刚才的三个老年代,后续可能再执行多次混合收集把剩下的老年代重新标记后再进行释放。

可能出现并发失败的情况:垃圾回收速度小于分配新对象的速度,就会触发一次FullGC,它的暂停时间就会很长了。
*巨型对象
而当将要存储的一个对象太大,一个区域装不下的话,就会存储到一个巨型对象当中,一块巨型对象区域不够的话就会分配一个连续的区域来进行存储。

(3)总结

六、强引用、软引用、弱引用、虚引用的区别
这四种引用类型主要指的是在进行垃圾回收时不同引用进行垃圾回收的情况是不同的



- 强引用
可以被GC Root定位或关联到的对象就证明是存活的,就不会被垃圾回收,即使出现了内存不足、抛出OM异常也不会被回收的强引用对象。 - 软引用
在进行垃圾回收时,一开始并不会垃圾回收当前的软引用对象,只有在进行垃圾回收后内存还是不足的情况下,才会再次进行垃圾回收并回收软引用对象。 - 弱引用
一旦出现内存不足,弱引用对象就会被垃圾回收器直接回收掉。
总结:

624

被折叠的 条评论
为什么被折叠?



