标记为垃圾收集vs符合java中的垃圾收集条件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标记为垃圾收集vs符合java中的垃圾收集条件相关的知识,希望对你有一定的参考价值。
我正在阅读Java中的垃圾收集概念。根据我的学习,它说GC在后台定期运行并检查任何未引用或无法访问的对象。但是当内存受到某种压力时,只有GC就完成了。 GC还有标记阶段,重定位阶段等阶段。在以下程序中,在第1行的末尾,是否有资格进行垃圾收集的对象,因为无法保证GC始终运行或者在GC之后立即标记为GC 1号线?
如果我在任何陈述中出错,请纠正我。
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
String three = "someString";
one = two = three=null;
System.out.println("testing "); // 1
System.out.println("testing again");// 2
}
}
在第1行,有多少个对象标记为垃圾回收?据我所知,2个对象将有资格获得GC,没有标记。答案可能有所不同
答案
在GC实际运行之前,没有对象标记为垃圾收集。并且标记由垃圾收集器生成,并且仅在GC运行时有效/有意义。
因此,询问对象是否在代码中的特定点被标记是......毫无意义。
您可能试图区分无法访问的对象与GC实际收集的对象之间的区别。但即使这样也通常无法回答,因为不同的Java GC在收集对象时的行为方式不同。
至于什么符合垃圾收集的条件,计数取决于JVM / GC实现,以及如何计算对象。例如:
- 由显式
String
创建的new
对象(很可能)将无法访问。 - 对应于字符串文字的
String
对象可能无法访问。 (除非GC足够聪明才能意识到main
方法不能再次使用它们......这不太可能) - 但是......第一个
String
物体实际上里面有一个char[]
。 - 并且......
System.out.println("testing ")
呼叫可能会产生垃圾。 - 并且......可能存在由JVM创建的任何数量的其他对象(在实例化JVM,构建
args
数组,加载类等等)时,此时可能无法访问。
简而言之,测验所提出的问题对于一个绝对正确的答案来说太模糊了。
以上是关于标记为垃圾收集vs符合java中的垃圾收集条件的主要内容,如果未能解决你的问题,请参考以下文章
67.Java垃圾收集机制对象引用垃圾对象的判定垃圾收集算法标记—清除算法标记—整理算法分代收集垃圾收集器性能调优