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()方法获得所引用的对象,但是虚引用不行。
标签:收集器,对象,GC,引用,JVM,new,Roots From: https://www.cnblogs.com/rockdow/p/17421165.html