我的應用程序創建了大量的類的實例,比如A類的所有實例都包含一個字符串,其中大部分包含相同的字符串依靠Java字符串複製上寫
class A {
String myString;
}
我知道JVM使「所有等於字符串」指向只存儲一次的相同字符串。如果我的A實例之一的myString字段被覆蓋,則對原始字符串的引用將被對新字符串值的引用所替代,並且所有工作均按預期工作,就好像每個實例都有一個字符串副本。
這種行爲是需要一個兼容的JVM,或者是一個諸如此類的改良可以從一個JVM切換到另一個,或因版本的JVM?
另一種方式把問題:設計higly冗餘(基於字符串的)數據結構時,應一個上寫機制副本只能依靠或者是adviceable到位的東西在應用程序級別?
Java字符串是不可變的 - 創建後無法更改。當您將一個字符串變量分配給另一個字符串時,您正在分配一個POINTER。如果更改了一個指針,則其他所有先前分配的指針變量保持不變,並仍然處理原始String。沒有「寫入時複製」已完成或需要。 –
這個行爲在JVM規範中非常明確。打破這將導致巨大的問題。 –
與其他語言一樣,我認爲節省內存是由thoruhg COW完成的。好吧,現在我明白這是通過指向不可變對象的指針獲得的。我回去糾正這個問題。 – AgostinoX