JVM中GC Roots及引用类型概述
Posted rockdow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM中GC Roots及引用类型概述相关的知识,希望对你有一定的参考价值。
-
活动线程(Active threads):正在执行的线程被视为GC Roots,因为它们持有当前执行状态的信息。
-
静态变量(Static variables):被声明为静态的变量属于类,因此它们会一直存在于内存中。
-
JNI引用(JNI references):Java Native Interface(JNI)引用是在Java代码中与本地(非Java)代码进行交互时创建的对象引用。
-
方法区中的类静态属性引用(Class static properties references):方法区中的类静态属性引用持有对其他对象的引用。
-
栈帧中的局部变量引用(Local variables references in stack frames):栈帧中的局部变量引用指向堆中的对象。
-
常量引用(Constant references):在编译时被确定为常量的引用。
在Java中,有以下几种引用类型:
-
强引用(Strong Reference):最常见的引用类型,也是默认的引用类型。强引用通过普通的对象引用方式来引用对象,只要强引用存在,垃圾收集器就不会回收被引用的对象。
-
软引用(Soft Reference):通过软引用来引用对象的话,只有在内存不足时,垃圾收集器才会回收被软引用引用的对象。软引用可以用于实现内存敏感的高速缓存。
-
弱引用(Weak Reference):弱引用的生命周期更短暂,即使内存充足,只要垃圾收集器运行,就可能回收被弱引用引用的对象。
-
虚引用(Phantom Reference):虚引用是最弱的引用类型。虚引用主要用于跟踪对象被垃圾收集器回收的活动。无法通过虚引用访问对象的任何属性或方法,也无法通过虚引用获取对象的实例。
举例:
Student stu = new Student(); //强引用类型 SoftReference<CacheObject> cacheRef = new SoftReference<>(new CacheObject()); //软引用类型需要利用java.lang.ref.SoftReference创建和使用 WeakReference<String> weakRef = new WeakReference<>("Hello"); //弱引用需要利用java.lang.ref.WeakReference创建和使用 PhantomReference<TestObject> phantomReference = new PhantomReference<>(new TestObject(), queue); //虚引用需要利用java.lang.ref.PhantomReference创建和使用
值得注意的是,软引用和弱引用可以利用get()方法获得所引用的对象,但是虚引用不行。
Java虚拟机(JVM)-- GC概述 & GC四大算法之引用计数法
1. GC概述
- GC,垃圾回收,JVM启动的时候除了启动进程-主线程,还有就是GC守护线程(一个JVM实例一个进程一个GC线程),它负责特定时间(运行期间某时刻触发,触发之后会根据相应的触发条件选择相应的算法清除对应空间里面的对象)对JVM内存区中的堆(包括方法区(非堆))的对象进行回收释放,是JVM对Java内存对象的一套管理机制,Java程序员不需要关心内存的分配以及回收的问题,这一切都由JVM来管理,而内存的回收则是由GC来完成。
回顾一下 GC 的作用域:
GC算法总体概述:
先看下一个对象的历程:
2. 引用计数法
- 每个对象有一个引用计数器,当对象被引用一次则计数器加1,当对象引用失效一次,则计数器减1,对于计数器为0的对象意味着是垃圾对象,可以被GC回收。
- 目前虚拟机基本都是采用可达性算法,从GC Roots 作为起点开始搜索,那么整个连通图中的对象边都是活对象,对于GC Roots 无法到达的对象变成了垃圾回收对象,随时可被GC回收。
以上是关于JVM中GC Roots及引用类型概述的主要内容,如果未能解决你的问题,请参考以下文章
JVM调优工具篇使用MAT工具分析dump文件(查看GC Roots)