Java中什么样的对象才能作为gcroot,gcroots有哪些呢

在java技术体系里面,固定可作为GC Roots的对象包括以下几种:1、在虚拟机栈中引用的对象,例如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等;2、在方法区中类静态属性引用的对象,例如java类的引用类型静态变量。

Java中什么样的对象才能作为gcroot,gcroots有哪些呢-Worktile社区

一、Java中什么样的对象才能作为gcroot

在java技术体系里面,固定可作为GC Roots的对象包括以下几种:

1、在虚拟机栈中引用的对象,例如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。

2、在方法区中类静态属性引用的对象,例如java类的引用类型静态变量。

3、在方法区中常量引用的对象,例如字符串常量池里的引用。

4、在本地方法栈中JNI引用的对象。

5、Java虚拟机内部的引用,如基本数据类型对应的class对象,一些常驻的异常对象等,还有类加载器。

6、所有被同步锁持有的对象。

7、反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

除了这些固定的GC Roots集合外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象临时性地加入,共同构成完整GC Roots集合。

作者:孤家寡人
链接:https://www.zhihu.com/question/50381439/answer/1408268664
来源:知乎

二、gcroots有哪些

在Java语言中,GC Root主要包括以下几类元素:

1、虚拟机栈中引用的对象
比如:各个线程被调用的方法中使用到的参数、局部变量等。

2、本地方法栈内JNI(通常说的本地方法)引用的对象

3、方法区中类静态属性引用的对象
比如:Java类的引用类型静态变量

4、方法区中常量引用的对象
比如:字符串常量池(string Table) 里的引用

5、所有被同步锁synchronized持有的对象

6、Java虚拟机内部的引用。
基本数据类型对应的Class对象,一些常驻的异常对象(如:
NullPointerException、OutOfMemoryError) ,系统类加载器。

7、反映java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等

8、除了这些固定的GCRoots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象“临时性”地加入,共同构成完整GC Roots集合。比如:分代收集和局部回收(Partial GC)。

延伸阅读

gcroots是什么

常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC roots且没有被GC roots引用的对象。

一个对象可以属于多个root,GC root有几下种:

  • Class – 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots,.
  • Thread – 活着的线程
  • Stack Local – Java方法的local变量或参数
  • JNI Local – JNI方法的local变量或参数
  • JNI Global – 全局JNI引用
  • Monitor Used – 用于同步的监控对象
  • Held by JVM – 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。然而,JVM并没有为这些对象提供其它的信息,因此需要去确定哪些是属于”JVM持有”的了。

文章标题:Java中什么样的对象才能作为gcroot,gcroots有哪些呢,发布者:小编,转载请注明出处:https://worktile.com/kb/p/37469

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编的头像小编

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部