垃圾收集

垃圾收集

问题描述:

假设在Java中的字符串被声明为String s = "hi"垃圾收集

我只是想知道,如果上面创建的String对象永远不会被垃圾收集?

如果我写s = null,这时String对象会被垃圾收集吗?

+3

从不。字符串文字由JVM –

+0

实现。但是,如果您执行'String s1 = s + 1; s1 = null',那么可以收集s1字符串。 – SJuan76

+0

你为什么在意?在Java(非Android)中唯一需要担心的是在某处是否有任何“遗留”引用 - 例如,旧的HashMap,您应该已经清除了,但是留下了一个相对静态的对象。 –

这样,编译器会将它移动到文字池中。现在所有“hi”的实例都将被池中的这个值所取代,这实际上是编译器优化内存使用的一种方式。不,这些值永远不会垃圾收集。但是,在运行时创建的String对象将被垃圾收集。

+1

所以,你的意思是“嗨”永远不会被垃圾收集......而新的String()将会......我是对吗? – Anand

+1

+1文字池。它听起来很酷:) – Prasanth

+0

@anand,是的。如果您按照您提到的方式创建字符串对象:new String(),它将像其他任何类型的对象一样被垃圾回收。 – Jimmy

JVM将字符串加载到字符串常量池中。这不是由javac或JIT编译器完成的。当没有更多的对象引用时,以这种方式加载到常量池中的String可以像其他任何对象一样清除。这将需要卸载该类,但如果您的应用程序以这种方式工作,则会发生这种情况。

+1

一个小术语:它实际上是“常量池”。 –