amp*_*ent 0 java garbage-collection
请考虑以下情形:
String dude = "Harold";
//some stuff
dude = "Kumar";
Run Code Online (Sandbox Code Playgroud)
一旦dude被赋予其第二个"Kumar"值,就会出现一个与"Harold"分开的全新对象.我想知道的是,因为"哈罗德"显然没有用,它是立即收集垃圾还是在JVM认为合适的时候收集?
更新:
仅仅因为dude已经设置为新值(对象)并不一定意味着已经消除了对旧对象的所有引用.如果另一个引用dude在"Harold"之后和"Kumar"之前调用,它显然会保留"Harold"对象:
String dude = "Harold";
//some stuff
String interim = dude;
dude = "Kumar";
System.out.println("dude = " + dude);
System.out.println("interim = " + interim);
Run Code Online (Sandbox Code Playgroud)
版画
dude = Kumar
interim = Harold
Run Code Online (Sandbox Code Playgroud)
因此,有比我最初想象的更多的考虑因素,因此初始值不一定必须在更改后超出范围.
没有什么是立即垃圾收集,并且不鼓励尝试强制垃圾收集(并且每次java发布都变得越来越困难).
是的,分钟"Harold"不再可达(没有指针链通向它)它有资格进行垃圾收集并可能被收集(如果GC运行).话虽如此,可以在const池中分配字符串,它位于perm gen中并且不是GC*(至少直到java 7).有关实习字符串的更多信息,请访问:http
://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
* - 不完全准确,即使它处于perm gen,const池仍然是GC.情况很复杂.