因此,如果我声明一个String对象str并为其赋值,然后为同一个String对象str分配一个不同的值,因为String类是不可变的,所以将在内存中创建一个新的String对象,str现在指向这个新对象。但是,由于旧的String对象现在由none引用,为什么不能立即对其进行垃圾回收?我知道如果创建一个具有相同值的新String字符串,将返回相同的早期对象,但它不太可能发生。当JVM知道糟糕的开发人员在他巨大的for循环的每次迭代中创建3个String对象时,有没有理由不运行GC?
答案 0 :(得分:2)
因为它不值得花时间。对于这个问题,分代收集器比在分配时微管理每个字符串要快得多。与复制收集器正在进行大量处理的内容相比,管理少量内存需要大量开销。
答案 1 :(得分:0)
注意以下行为自java 7以来已发生变化,以防止出现下述问题。 这个答案提供了一个很好的详细解释Java 7 String - substring complexity
除了Will所说的,每次创建“String”并不意味着JVM可能没有对该字符串的其他引用。这是因为String
的“实习生”行为e.g。
String x = "This is a new string"
String y = x.subString(0,1) ; //y = "T"
x = null; //discard X
但是,内部不会创建新的字符串文字。相反,'x'和'y'都引用相同的文字字符串。 “String”的开始和结束索引属性 y将是(0,1) - >指着文字 - > “这是一个新字符串”
免责声明:术语可能不完全准确