簡體   English   中英

字符串不可變性記憶問題

[英]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。

GC收集未使用的對象。

和Immutability在java中有很多好處。

在Java中,實現盡可能多的不變性是一種很好的做法。

它們也可以安全地用在Collections框架中。

檢查一下

據我所知, StringBuilder (或線程安全的StringBuffer )對於管理String並使它們可變是有用的。

操縱一個巨大的字符串中的一些字符不要“吃掉”內存中的許多字節。

它也更強大/速度更快。

由於字符串實例是不可變的,因此可以由jvm重用。 String類使用Flyweight設計模式實現,用於避免內存問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM