[英]String Immutability memory Issue
一旦創建了String對象,我們就無法修改它但是如果我們對它進行任何操作,JVM將創建New Object。 這里通過創建新對象,JVM消耗更多內存。 然后我認為這會導致記憶問題正確。
你是對的。 這絕對是值得意識到這個問題,即使不每次都影響到你。
正如你所說,字符串在創建后無法改變 - 它們是不可變的,並且它們沒有暴露出許多改變它們的方法。
但是,諸如split()之類的操作將在后台生成其他字符串對象,並且如果您持有對它們的引用,則每個字符串都會產生內存開銷 。
正如其他海報所指出的那樣,對象會很小,垃圾收集通常會在它們超出范圍后清理舊的,所以你通常不必擔心這個問題。
但是,如果你正在做一些特定的事情並持有大量的字符串引用,那么這可能會讓你感到害怕。
根據您的使用情況查看String interning ,並注意鏈接頁面上的警告。
有兩點需要注意:
1)硬編碼的字符串文字將由Java 自動實現 ,減少了這種影響。
2)+運算符在這方面效率更高,它將使用String Builders來提供性能和內存優勢。
不,那不是。 如果您沒有持有String實例的強鏈接,它們最終將被垃圾收集器收集。
例如:
while (true) {
new String("that is a string");
}
在這個片段中,你不斷創建新的對象實例,但是你永遠不會得到OutOfMemoryException,因為創建的實例變成了垃圾(顯然沒有強大的鏈接)。
它為新對象消耗更多內存,這是正確的。 但是這個事實本身並不會產生問題,因為垃圾收集器會立即回收所有無法訪問的內存。 當然,您可以通過創建指向新創建的字符串的鏈接將其轉換為問題,但這將是您的程序的問題,而不是JVM的問題。
你必須要知道的最大內存問題是使用一個巨大字符串的小子串。 該子串共享原始字符串的char數組,即使原始字符串獲得gc'd,子字符串仍將引用巨大的char數組。 解決方法是使用new String(hugeString.substring(i))
。
生成的問題是生成垃圾的事實。 虛擬機通過調用垃圾收集器來解決此問題,垃圾收集器釋放垃圾使用的內存。
一旦舊對象不再使用,它就可以被垃圾收集器刪除。 (這將在出現任何內存問題之前完成)。
如果要防止復制數據,請使用StringBuilder。
據我所知, StringBuilder (或線程安全的StringBuffer )對於管理String並使它們可變是有用的。
操縱一個巨大的字符串中的一些字符不要“吃掉”內存中的許多字節。
它也更強大/速度更快。
由於字符串實例是不可變的,因此可以由jvm重用。 String類使用Flyweight設計模式實現,用於避免內存問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.