2011-05-19 147 views
9

我發現使用String.substring已知與String.split相關的內存問題。Java String.split內存泄漏?

使用String.split時是否有內存泄漏?

如果是,那麼解決方法是什麼?


以下鏈接顯示Java中子字符串的正確用法。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513622


還有一個博客裏面談到可能在MLK子。

http://nflath.com/2009/07/the-dangers-of-stringsubstring/

+6

我知道英文可能不是你的第一語言,但這個問題沒有意義。請給我們一些背景。 – 2011-05-19 09:19:30

+0

我不認爲這種常用的方法存在內存泄漏,這是自早期Java版本以來存在的。但是如果發現內存泄漏,請提供一些信息。 – 2011-05-19 09:21:47

+1

你能告訴我們關於你提到的已知解決方法的鏈接嗎? – jabal 2011-05-19 09:21:51

回答

12

更新:行爲1.7.0_06已經改變:請參見這篇文章:Changes to String internal representation made in Java 1.7.0_06在java-performance.info。


正如指出的@finnw的確有一種內存泄漏使用String.substring時虎視眈眈。原因是String.substring只返回給定字符串的一部分的視圖,即,底層字符串仍然保存在內存中。

要強制創建與源無關的新字符串,您必須使用new關鍵字。即,你必須例如

String[] parts = orig.split(";"); 
//String mySubstring = parts[i];    // keeps orig from being GC'd 
String mySubstring = new String(parts[i]);  // creates a new string. 

或做的,或許更直接

String mySubstring = new String(orig.split(";")[i]); 

我必須說,這行爲似乎「不必要的」給我。它應該可以使用弱引用或其他技術來解決。 (尤其是考慮到String已經是一個特殊的類,是Java語言規範的一部分。)

+0

謝謝,但使用分裂有什麼問題? – Avinash 2011-05-19 09:46:26

+0

不可以。如果你使用'new String(...)'分開你想要保留的字符串,你應該沒問題。 – aioobe 2011-05-19 09:47:23

+1

我想,不使用弱引用的原因是因爲垃圾收集器處理的代價很高。這是那些通常是顯着優化的事情有時是相反的不幸情況之一。 – 2011-05-19 11:12:33