面试题-JVM-GC

19 篇文章 0 订阅
2 篇文章 0 订阅
1、GC基础
1.1、GC基础算法
  • 标记清除、标记整理、复制、分代。这些算法做的第一件事都是标记。
1.2、JVM标记算法
  • JVM标记算法采用了根搜索引擎,根有几种:
    1、JVM栈(虚拟机栈)的引用;2、静态类、常量的引用;3、本地栈中的引用;4、本地方法的引用;

  • 标记分为几个阶段:
    1、标记直接和根引用的对象;2、标记间接和根引用的对象;3、由于分代算法,被老年代对象所引用的新生代的对象。

  • 第三种标记使用了卡片标记的方法,避免Minor GC扫描整个老年代:
    1、将老年代内存分片,1个片默认是512byte;
    2、如果老年代对象发生了修改,就把这个老年代对象定义为脏dirty;或者老年代对象指向了新生代,也会标记为脏dirty;
    3、没有标记为脏的老年代片没有指向新生代,所以不用扫描;
    4、Minor GC只扫描脏dirty的卡片对象,不扫描整个老年代。

  • 做Minor GC标记的时间 = 扫描JVM栈里根的时间 + 扫描脏卡片的时间 + 扫描老年代的直接根的时间。

1.3、GC算法
  • 标记-清除算法
    第一阶段从引用根节点开始标记所有被引用的对象;
    第二阶段遍历整个堆,把未标记的对象清除;
    缺点:会产生内存碎片。

  • 复制算法
    将内存空间划分为两个相等的区域,每次只使用其中的一个区域。回收时复制正在使用中的对象到另一个区域,复制完之后清空之前的区域。复制成本小,不会出现“碎片”的问题。
    缺点:需要两倍的内存空间。

  • 标记-整理算法
    第一阶段:遍历GC Roots,将存活的对象标记。
    第二阶段:移动所有存活的对象,按照内存地址次序一次排列,然后将末端内存地址之后的内存全部回收。
    缺点:效率不高。低于复制算法。

  • 在GC线程开启时,或者说GC过程中,都需要暂停应用程序。

  • JAVA堆的对象回收(主要回收两种对象:存活时间短的对象、存活率高的老年代对象)。
    对于存活时间短的可以使用复制算法;
    对于老年代对象,可以使用标记整理算法

1.4、回收的时机
  • GC按照回收的区域分了两种类型,一种是普通GC(minor GC),一种是全局GC(full GC)。
  • minor GC:只针对新生代区域的GC。
  • full GC:主要针对老年代的GC。
  • 要经过好多次minorGC,才会触发一次fullGC。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值