GCRoot

作者: 王猛biu | 来源:发表于2018-06-05 20:41 被阅读153次

用于记录学习

一、可达性分析算法:通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连时,则该对象不可达,该对象是不可使用的,垃圾收集器将回收其所占的内存。

    在java语言中,可作为GCRoot的对象包括以下几种:

    a. java虚拟机栈(栈帧中的本地变量表)中的引用的对象。 

    b.方法区中的类静态属性引用的对象。 

    c.方法区中的常量引用的对象。 

    d.本地方法栈中JNI本地方法的引用对象。

二、GC(Garbage Collector) Roots 实际上是垃圾回收器需要回收的对象。垃圾回收器回收那些不是 GC Roots 的对象并且不再被GC Roots引用的对象。

这里有几种可以作为 GC Roots 的对象。一个对象可以属于多种类型的 Root。有以下几种类型的 Root 对象。

Class-通过系统的类加载器加载的class。这种class是不可能被卸载的。它们可以通过静态数据域引用对象。这里需要注意的是,通过用户自定义的类加载器加载的Class并不能作为 GC Roots,除非相应的 java.lang.Class 的实例恰巧成为 GC Roots 对象。

Thrad-存活的线程

Stack LocalJava 方法中的变量或者方法形参

JNI Local-JNI方法中的变量或者方法形参

JNI Global-全局 JNI引用

Monitor Used-用于同步监控的对象

Held by JVM-JVM由于一些原因会从垃圾回收器中持有一些对象的引用。实际上,这里和 JVM本身的实现有关。一些可能的已知原因是,系统的类加载器,一些jvm自身已知的异常类,一些预分配的异常处理对象,正在加载类的自定义类加载器。很不爽的是,JVM基本没有提供额外的细节去描述这些对象。因此,这仅仅能通过分析去判断哪些对象是所谓的 JVM持有的。

如果一个对象是一个 GC Roots 对象,在所有的视图中它都会被特别的标记来表明它是一个独立的对象。下面这张图展示了一个 Fragment 中的对象视图路径

相关文章

  • gcroot和auto_gcroot的差异

    auto_gcroot是对gcroot的包装,在析构函数中调用delete删除gcroot中的句柄,gcroot仅...

  • GCRoot

    用于记录学习 一、可达性分析算法:通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过...

  • gcroot

    在java中,可作为GC Roots的对象有: 1.虚拟机栈(栈帧中的本地变量表)中引用的对象; 2.方法区中的类...

  • 通过GCHandle在native class内部保存一个man

    一般是通过gcroot<>或者auto_gcroot<>来完成这个工作.但也可以直接用GCHandle来实现。其实...

  • Java gcroot

    在Java语言中,GC Root主要包括以下几类元素: 1、虚拟机栈中引用的对象比如:各个线程被调用的方法中使用到...

  • 51 Jvm性能优化-三色标记算法如何处理漏标问题

    1.GC如果想查找到存活的对象,根据可达分析算法 根据GCRoot引用链遍历存活对象。根据GCRoot遍历过程中,...

  • GCRoot与safePoint

    HotSpot虚拟机使用可达性分析算法确定对象是否可以被GC。 可达性分析算法从一系列GCRoot对象开始,向下搜...

  • JVM 中GC Roots对象有哪些?

    在java虚拟机的GC中,什么对象可作为GCRoot的对象?

  • 知识点欠缺

    java锁的使用,锁类型(CAS)JVM模型GCRoot有哪些volatile和synchronized(锁升级)...

  • JVM(二) GC算法与分代回收策略

    可达性分析 GCRoot场景 垃圾回收算法 分代回收策略 引用 垃圾回收 垃圾回收(Garbage Collect...

网友评论

      本文标题:GCRoot

      本文链接:https://www.haomeiwen.com/subject/mqimsftx.html