枚举根节点

1人阅读 评论(0) 收藏 举报
分类:

GC Roots 枚举根节点

参考:《深入理解java虚拟机》

描述:GC Roots 被虚拟机用来判断对象是否存活。

可以做为GC Roots的对象

位置 对象
虚拟机栈 栈帧中的本地变量表
本地方法栈 JNI(一般指的Native方法)引用的对象
方法区 静态属性引用对象
方法区 常量引用对象

枚举根节点

可达性分析需要考虑下面两个点:

  1. 如果方法区大小就有数百兆,如果逐一检查引用,则肯定消耗性能,所以不可能这么做

  2. 在执行可达性分析时,必须要保证这个过程期间对象的引用关系不能再变化,否则不能保证分析结果正确性

第二点: 必须要停止所有线程去执行枚举根节点,被称为Stop the World

上面两个点反映出来的性能问题,应该如何解决呢?

解决方法

  1. OopMap数据解构: 保存GC Roots 节点,避免全局扫描去一一查找。(目前主流java虚拟机都是准确式GC
  2. 安全点: 精简指令,为特定位置(安全点: Safepoint)上的指令生成对应的OopMap,暂停进行GC的位置也是在安全点;
  3. 安全区域 :在一段代码中,引用关系不会发生变化,在这个区域中的任意地方开始GC都是安全的。处理没有被分配CPU时间的线程。

OopMap会在类加载时进行计算,并在JIT也会进行记录。

安全点设置原则:
1. 不能太少,太少会导致GC等待时间过长
2. 不能太过于频繁,以致于过分增加运行时的负荷

所以安全点的选定基本都是以“是否具有让程序长时间执行的特征”为标准进行选定–因为每条指令执行的时间都非常短暂,程序不太可能因为指令流长度太长这个原因而过长时间运行,“长时间执行” 的最明显特征就是指令程序复用,例如方法调用,循环调转 ,异常跳转等。所以具有这些功能的指令才会产生SafePoint

GC发生时,让所有线程(不包括执行JNI调用的线程) 都“跑”到最近的安全点上再停顿:

  1. 抢先式中断(Preemptive Suspension) : GC发生时,中断全部线程,如果发现线程不在安全点,则恢复让其”跑” 到安全点
  2. 主动式中断(Voluntary Suspension ): 设置一个标志,然后采用轮询触发。

安全区域(Safe Region): 主要针对没有分配CPU时间的线程,如线程处于Sleep状态或者Blocked状态。这个时候线程无法响应JVM的中断请求。所以需要安全区域来解决。

查看评论

深入理解jvm — GC篇

java自动管理内存主要解决的两个问题: 1、给对象分配内存,上篇博客已经介绍过了http://blog.csdn.net/ying1414058425/article/details/6014154...
  • ying1414058425
  • ying1414058425
  • 2017-03-03 17:59:46
  • 286

在XML的根节点加入子节点

  • 2010年07月02日 10:46
  • 87KB
  • 下载

删除XML根节点下的某子节点

  • 2010年07月02日 10:33
  • 85KB
  • 下载

获取根节点的两种方式

1.ServletActionContext.getServletContext().getRealPath("/") -- Strust2的方法 2.this.getClass().get...
  • u011768325
  • u011768325
  • 2016-08-25 10:47:44
  • 1146

数据库表设计,没有最好只有最适合(邻接表、路径枚举、嵌套集、闭包表)

【转载小小情义的博客】 我们在设计数据库的时候,是否会突破常规,找到最适合自己需求的设计方案,下面来举个例子:      常用的邻接表设计,都会添加 一个 parent_id 字段,比如...
  • qq_32439101
  • qq_32439101
  • 2017-09-30 14:30:20
  • 203

xml文件中删除根节点

//删除根节点 TiXmlDocument *myDocument = new TiXmlDocument(filefullPath.c_str()); myDocument->LoadFil...
  • lxh1230119
  • lxh1230119
  • 2012-06-18 19:09:07
  • 1701

读取xml根节点值

xml version="1.0" encoding="gb2312" ?> -Root> -Head> - 报文头内容数据项参见商业银行财政业务接口技术规范  ...
  • cheng9007
  • cheng9007
  • 2011-11-22 13:21:05
  • 375

树寻找根节点

// // main.cpp // 寻找根节点 // // Created by liujan on 1/13/15. // Copyright (c) 2015 liujan. All ri...
  • liujan511536
  • liujan511536
  • 2015-03-10 10:46:33
  • 962

根节点

无论布局的根节点是什么,系统都会在上一层生成一个,根节点使用是多余的,可以用代替。...
  • afterwinter
  • afterwinter
  • 2015-07-11 10:51:46
  • 278

SQL应用之查找根节点

MSSQL提供了CTE递归取数据的方法,但是没有直接提供一个给定任意节点查找其根节点的方法(也是ms sql 2008之后的版本有我不知道)。 此外,如果数据库提供的数据出现死循时,如果没有相应的检测...
  • gezhonglei2007
  • gezhonglei2007
  • 2016-09-16 21:32:11
  • 852
    个人资料
    持之以恒
    等级:
    访问量: 7805
    积分: 287
    排名: 27万+
    文章分类
    文章存档