JVM中的GC(面试自用)

谈谈你对JVM的GC的理解

首先JVM中对内存的分配和回收是不需要人工参与的,java虚拟机中的垃圾回收机制会对无用对象进行回收。

      那么什么无用对象呢,有两种方式进行判断,一、引用计数法,每个对象维护一个计数器,当有一个引用指向它时,该计数器+1,当引用断开时,该计数器-1,等到JVM中GC进行垃圾回收的时候,会把引用计数器值为0的对象进行回收,这种方法有一个缺点,那就是对循环引用的对象无法识别并回收。所以当前虚拟机主要使用的是第二种判断对象是否应该被回收的方式,二、GC Root 可达性,这种方式以GC Root作为根节点,向下遍历,如果对象直接或间接被GC Root引用,那么我们就说GC Root到该对象之间是可达的,等到JVM 中GC进行回收的时候,会把不可达的对象进行回收,常见的GC Root 有Java虚拟机栈中引用的对象,本地方法栈中引用的对象,方法区的类静态属性引用的对象,常量引用的对象等。

    我们知道了JVM 中GC会对哪些对象进行回收,那如何进行回收呢,常见的垃圾回收算法有四种,标记-清理;标记-整理;标记-复制;分代回收。标记-清理是指GC进行回收时把从GC Root可达的对象进行标记,然后把没有标记的对象进行回收,这种反方式的缺点是会产生内存碎片。所以有了标记-整理,标记整理先把可达的对象进行标记,然后将带有标记的对象向一端移动,然后清除掉端边界以外的内存。标记-复制算法是把内存区域分为两部分1:1 ,当JVM 进行GC的时候,把带有标记的对象移动到另一半区域,然后回收原对象所在区域内存,该方式的缺点是内存只能有50%被利用。最后是分代回收算法,因为JVM中不同的对象有不同的生命周期,不同的生命周期采取的垃圾回收方式不同会有更高的效率,该方式把堆分为新生代和老年代,新生代因为对象存活率比较低所以采用的是标记-复制算法,把内存分为8:1:1,即一个eden区和两个survive区,当进行GC的时候,把eden区中存活的对象复制到From Survive中,然后对eden区进行回收,当Eden区和From Survive都,满了之后把Eden区和From Survive中的存活的对象复制到To Survive中,然后From Survive 和To Survive 进行交换。老年代中的对象是经历过N代仍存活了,因为对象存活率比较高,所以采用标记-整理的算法。

   最后就是什么时候会触发GC:

1、当System.gc()或Runtime.getRuntime.gc()被显式调用的时候

2、当一个新的对象被实例化的时候

3、当Sruvive区满的时候,会触发Minor GC

4、当老年代内存满的时候,会触发一次Full FC

 

可以把对象的四大引用类型(强引用、软引用、弱引用和虚引用)介绍一下,以及GC收集器 Serial 收集器、ParNew收集器、CMS收集器简单介绍下,可能会加分。

 

总结起来就是,一、背景;二、对哪些对象进行回收;三、如何进行回收;四、何时进行回收;
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值