zoukankan      html  css  js  c++  java
  • Hotspot GC实现原理

    GC扫描

    可达性分析的GC Roots主要是全局性引用或在Stack Frame中 ,现在的应用仅仅方法区往往就有几百兆,这样要这个检查这里面的引用,就必然会消耗很多时间,效率很低。

    分析工作在一个保证一致性的快照中进行。在整个分析期间,要确保整个执行系统被冻结,如果分析过程中对象引用还有不断变化,就会影响分析结果,准确性便无法保证。这是GC工作时必须停止当前所有线程的一个重要原因。

    当系统停下来后,并不会一个不漏的检查所有全局区,而是通过使用一种称为 OopMap的数据结构来获取对象引用的位置信息。

    类加载完成后,Hotspot就会把对象内什么偏移量上什么类型的数据计算出来,在编译过程中,也会在特点位置记录下栈和寄存器中那些位置是引用。这样GC扫描时就知道那些是引用了。

    安全点

    OopMap的协助下,Hotspot可以快速准确的枚举GC Roots

    记录了引用信息的地方叫做Safepoint(安全点),在程序执行时,并不是所有的地方都能停顿下来开始GC,只有到达安全点才可以。

    1)安全点不能少(GC等待时间太长),也不能太多(GC频繁启动)。所以安全点选定的标准就是,是否具有让程序长时间执行的特征。

    2)还需要考虑,如何在GC发生时让所有线程都跑到最近的安全点上再停下了。

     

    安全区

    对于处于sleepblacked状态的线程,无法响应jvm发出的请求,走到安全点去中断挂起。这就需要Safe Region安全区。

    安全区指的就是一段代码片段之中,引用关系不会发生变化。在这个区域任何地方开始GC都是安全的。在线程离开Safe Region 时会检查系统是否已经完成了GC,如果没有完成,就等待直到收到可以安全离开Safe Region的信号为止。

  • 相关阅读:
    unity3d中获得物体的size
    Quartz中时间表达式的设置-----corn表达式
    .net web 开发平台- 表单设计器 一(web版)
    编写你自己的单点登录(SSO)服务
    2009年末最强梅麻呂3D动画游戏大作 汉化补丁
    程序猿加班到深夜,你经历过没?
    初步理解socket
    几种开源分词工具的比較
    ORM框架
    linux tar.gz zip 解压缩 压缩命令
  • 原文地址:https://www.cnblogs.com/holos/p/6622023.html
Copyright © 2011-2022 走看看