我看到很多关于不可变字符串的Q& A说当我们执行以下操作时JVM实际上创建了一个新引用:
String text = "apple";
text = "orange"; // a new reference is created
我的问题是,之前的参考“苹果”发生了什么?由于Java垃圾收集是自动的,这是否意味着没有有意重新声明内存的方法?
编辑: 我问这个问题的原因是我想知道将来如何处理String变量。
字符串文字是否被GC清除?如果没有,那么游戏池会不会变得如此庞大,直到内存不足为止?考虑到程序是否从UI上的文本框接收不同的字符串值,用户输入的每个不同值将添加到池中。
答案 0 :(得分:3)
即使使用System.gc()
,也无法有意回收内存(这只是对JVM的建议)。
即使垃圾收集运行,“苹果”也不一定会被回收。
根据JLS 3.10.5,字符串文字被固定在字符串池中,因此永远不会被垃圾收集。
引用:
字符串文字是对String类实例的引用(§4.3.1,§4.3.3)。
此外,字符串文字总是指同一个类的实例 字符串。
这是因为字符串文字 - 或者更一般地说是字符串 这是常量表达式的值(§15.28) - 是“实习” 以便使用String.intern。方法共享唯一的实例。
修改强>
根据this answer,即使是被拦截的字符串也可以被垃圾收集。
答案 1 :(得分:2)
不,你不能强制GC运行。重要的是要认识到"apple"
字符串不会被销毁。它被声明为文字字符串,因此它将成为字符串池。
答案 2 :(得分:1)
无法显式回收完全取消引用的对象。您可以致电System.gc();
,但这仅仅是执行gc的建议,而不是保证将执行gc