java - 内部常量是否符合 GC 条件?

标签 java garbage-collection java-6 scjp

引用this页面:

How many objects will be eligible for GC here?

String s = "hello";
Character ch1 = 1;
Character ch2 = 1;
ch1 = null;
s = null; 

I believe the answer is 1.

我想了解它在 Java 6 中的工作原理。

我目前的理解:

字符串将进入池。后来就没有再提及了。所以,根据this回答(我不明白关于类加载器的部分,你能澄清一下吗?),字符串池很可能不会被垃圾收集......

好的,人物。有this Java 中的优化将导致 ch1ch2 指向同一个对象。所以,这个小人物也要去一些池子里。但是,尽管 ch1null,我们仍然可以通过 ch2 引用访问 1

所以,我现在的答案是 0。

我的每一步都正确吗?如果不是,请纠正我。您能否解释一下它到底是如何工作的?

最佳答案

您的答案“没有收集任何内容”是正确的,至少只要定义字符串的类存在即可。

"hello" 是一个字符串文字,它出现的类引用它。只要该类可访问,文字就会保留。

类也可以被 GC 回收。但是每个类都会引用它的类加载器并被它引用。通常,您不关心类加载器,因为您使用默认的类加载器,并且它(以及您的所有类)会一直保留到最后。

某些应用程序(例如 Web 服务器)需要能够动态加载和卸载某些代码(例如 servlet)。这就是使用类加载器的地方。

关于java - 内部常量是否符合 GC 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27283005/

相关文章:

solr - Lucene:无需重新索引即可迁移 Java 版本

testing - 如何在 Java 5 中检查 Java 6 代码?

java - 什么是NullPointerException,我该如何解决?

java - 静态引用被清除——如果未使用,Android 是否会在运行时卸载类?

Java 堆内存使用波动

javascript - JS 闭包上下文对象的生命周期?

java - Java 1.6 中的 future 任务

java - 使用 Spring Security 将 SAMl2.0 token 转换为 JWT/OIDC

java - 调用数组运算符

java - FibonacciHeap 是最小堆吗?如何使用 FibonacciHeap 找到最大值?