如果在編譯時將字符串定義爲文字[例如:String str = "java";
]那麼它會被垃圾收集?
可能不是。代碼對象將包含對錶示文字的String
對象的一個或多個引用。所以只要代碼對象可達,String
對象就會到達。
代碼對象可能無法訪問,但前提是它們是動態加載的......並且它們的類加載器被破壞。
如果我使用實習方法[e。g:String str = new String("java").intern()
]那麼它會被垃圾收集?
intern
調用返回的對象將是表示"java"
字符串文字的相同對象。 (該"java"
文字是在類加載時間實習。然後,當您實習生新構造String
對象在您的代碼段,它會查找並返回先前實習"java"
字符串)。
然而,實習是不相同的字符串字符串文字可以垃圾收集一旦變得無法訪問。 PermGen空間是在所有最近的HotSpot JVM上收集的垃圾。 (現有到Java 8 ...而下降的PermGen完全。)
而且將它從字符串文本區別對待在點1
否...因爲它是相同的對象字符串文字。
事實上,一旦你明白髮生了什麼,很明顯字符串文字也沒有被特別處理。這只是「可達性」規則的應用...
有些地方提到文字將被垃圾收集只有當String
類將被卸載?這是否有意義,因爲我認爲String
類不會被卸載。
你說得對。這沒有意義。說這些來源是不正確的。 (如果您發佈了一個URL,以便我們可以閱讀他們正在說的內容,這將對您有所幫助...)
1 - http://stackoverflow.com/questions/2202162/garbage-collection-and-strings; 2 - http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java; 3 - String a = new String(「asd」) - >「a」引用將被垃圾回收,但只是對「asd」的引用,並且「asd」將永遠存在。 – user1050755 2013-03-10 15:54:52
如果你搜索更多,你會發現提到的地方使用實習生創建的字符串文字可以垃圾收集,因爲他們使用弱參考,但我不能確認它,這就是爲什麼我張貼的原因,因爲有很多混合的反應。 – Lokesh 2013-03-10 15:57:50