目录
- java.lang.ref包相关的API文档
- ref包的内容
- 类
- 相关线程
- ref包的规范
- ref包支持应用与GC进行有限交互
- ref包中的引用类型
- ref包核心逻辑
- 可达性
- 强可达
- 软可达
- 弱可达
- 虚可达
- 不可达
- 总结
零、API documentation
java.lang.ref API documentation: https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/ref/package-summary.html
Provides reference-object classes, which support a limited degree of interaction with the garbage collector.
other consideration: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html
1.Some applications interact with garbage collection by using finalization and weak, soft, or phantom references.
2.Another way that applications can interact with garbage collection is by invoking full garbage collections explicitly by calling
System.gc()
.
总结
从两个文档中可以得出这样的结论:
- 至少有两种方式支持应用与JVM GC进行交互:
- java.lang.ref包中的引用:有限交互
- 场景:在应用中使用不同的Java引用类型,当GC发生的时候会触发不同的资源回收操作
- Java堆内存资源:SoftReference & WeakReference
- 其他资源:PhantomReference & jdk.internal.ref.Cleaner
- 兜底机制:FinalReference & Finalizer
- Java9提供的资源回收机制:java.lang.ref.Cleaner
- 场景:在应用中使用不同的Java引用类型,当GC发生的时候会触发不同的资源回收操作
- System.gc:通常是一次full gc,配置一些jvm参数,CMS会优化成一次background GC,G1会优化成一次轻量级的并发收集(见下面补充)
- 场景:在应用中手动控制GC的发生
- java.lang.ref包中的引用:有限交互
补充:Explicit Garbage Collection(显式GC)
在第二个api documentation中还提及了显式GC的问题——System.gc
Another way that applications can interact with garbage collection is by invoking full garbage collections explicitly by calling
System.gc()
.
除了java.lang.ref包中的引用类,通过System.gc也能够和垃圾收集进行交互,而且System.gc默认是full gc(full garbage collections)。你可以通过-XX:+DisableExplicitGC来禁用System.gc(默认不禁用),同时,如果你配置了-XX:+ExplicitGCInvokesConcurrent,那么在CMS和G1垃圾收集器下,就不再是默认的full gc,CMS下会做一次background的并发GC,G1下会做一次轻量级的并发收集try_collect_concurrently。