1、对象什么时候可以被垃圾回收器回收
如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。
定位垃圾的方式有两种:
- 可用计数法
- 可达性分析法 (使用)
2、JVM垃圾回收算法有哪些
- 标记清除算法:垃圾回收分为2个阶段,分别是标记和清除,效率高,有磁盘碎片,内存不连续(用的比较少)。
- 标记整理算法:与标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低(一般老年代的垃圾回收器会使用)。
- 复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另外一个内存空间中,然后将内存空间清空,交换两个内存的角色,完成垃圾的回收;无碎片,内存使用率低(一般年轻代的垃圾回收器使用)
3、JVM的分代回收
3.1 堆的区域划分
- 堆对被分为了两份:新生代和两年带【1:2】
- 对于新生代,内部又被分为了三个区域。Eden区,幸存者区survivor(分为from和to)【8:1:1】
3.2 对象回收分代回收策略
- 新创建的对象,将会先分配到eden区
- 当伊甸园区内存不足,标记伊甸园与from(现阶段没有)的存活对象
- 将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和from内存都得到释放
- 经过一段时间后伊甸园的内存又出现不足,标记Eden区域to区存活的对象,将其复制到from区域
- 当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会提前晋升)
4、MinorGC、Mixed GC、FullGC有什么区别
MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1收集器持有
FullGC:新生代+老年代完整垃圾回收,暂停时间长(STW),应尽力避免
5、JVM有哪些垃圾回收器
- 串行垃圾回收器:Serial GC 、 Serial Old GC
- 并行垃圾回收器:Parallel Old GC 、 ParNew GC
- CMS(并发)垃圾回收器:CMS GC,作用在老年代
- G1垃圾回收器,作用在新生代和老年代
6、聊下G1垃圾回收器
- 应用于新生代和老年代,在JDK9之后默认使用G1
- 划分成多个区域,每个区域都可以充当Eden,survivor,old,humongous,其中humongous专为大对象准备
- 采用复制算法
- 响应时间与吞吐量兼顾
- 分成三个阶段:新生代回收(stw)、并发标记(重新标记stw)、混合收集
- 如果并发失败(即回收速度赶不上创建新对象速度),会触发FUll GC
7、强引用、软引用、弱引用、虚引用的却别
- 强引用:只要所有GC Roots 能找到,就不会被回收
- 软引用:需要配合SoftReference使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
- 弱引用:需要配合WeakReference使用,只要进行了垃圾回收,就会把弱引用对象回收
- 虚引用:必须配合引用队列,被引用对象回收时,会将虚拟应用入队,由Reference Handler线程调用虚引用相关方法释放直接内存