美文网首页
Java垃圾回收器GC如何确定“垃圾”

Java垃圾回收器GC如何确定“垃圾”

作者: 南风nanfeng | 来源:发表于2018-06-25 16:48 被阅读22次

对于不再有用的对象,Java有垃圾自动回收机制(Garbage Collection,GC)。哪些东西会被垃圾收集器 (Garbage Collector)认定为不再有用的对象?简单地说,任何无法被JVM中正在执行的线程通过引用变量名追寻到的对象,就是GC认定的垃圾。

具体来讲,在Java中采取了可达性分析法。原理是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有任何可达路径,则称该对象是不可达的,但是要注意,被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。

本文只是简单示例对象成为垃圾的情形,通常情况,在启动JVM之后,JVM中就会有一些执行线程,最基本的,就是程序执行入口的主执行线程(main thread),基本上,main 主线程是你要关心对象是否成为垃圾的起点。

如果有下面一段代码:

Some some1 = new Some();
Some some2 = new Some();
Some some1 = some2;
对象引用.jpg 改变引用.png

这个时候,原先被some1引用的对象不再被任何变量引用,通过主线程也不再可以找到该对象,这个对象就是内存中的垃圾了,GC会自动找出这些垃圾并予以回收。

线程内引用.png 对象引用链.png image.png image.png image.png

相关文章

网友评论

      本文标题:Java垃圾回收器GC如何确定“垃圾”

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