什么时候将一个string垃圾收集在Java中
在Java中,当对象没有实时引用时,就有资格进行垃圾回收。 现在在string的情况下,情况并非如此,因为string将进入string池,并且JVM将保持该对象活着以用于重用。 这意味着一旦创build的string将永远不会被垃圾收集?
现在在string的情况下,情况并非如此,因为string将进入string池,并且JVM将保持该对象活着以用于重用。 这意味着一旦创build的string将永远不会被垃圾收集?
首先,它是string文字被自动添加/添加到string池中。 由应用程序创build的string不会被拦截,除非您的应用程序显式调用String.intern()
。
其次,实际上,String池中垃圾收集对象的规则与其他string/其他对象相同。 如果string变得无法访问,string将被垃圾回收。
实际上,与String文字对应的String对象通常不是垃圾收集的候选对象。 这是因为在每个使用文字的方法的代码中存在对string对象的隐式引用。 这意味着只要该方法可以执行,该string是可访问的。
但是,情况并非总是如此。 如果文字是在dynamic加载的类中定义的(例如使用Class.forName(...)
),则可以安排该类被卸载 。 如果发生这种情况,string的String对象将无法访问,并且当包含实例化string的堆获取GC时将被回收。
你是对的; 实习生池中的string永远不会GC'd。
但是,大部分string都没有被拦截。
string文字是实现的,而传递给String.intern()
的string是实现的,但是所有其他string都不是实际的,可以正常GC'd。