2010-09-06 32 views
2

有些疑問我有以下關於java字符串處理池查詢:關於Java的字符串池

  1. 是它是按我的理解。至於JVM的本機堆的一部分Java堆的一部分,其第一。

  2. 我們對這個字符串池的大小有任何限制嗎?或者它是用戶可配置的嗎?

  3. 在以下兩個聲明

    String str = "Stack"; 
    String str2 = str.concat("overflow"); 
    

按我的理解,第一個字符串字面將是串池的一部分,但在那之後,我沒有CONCAT相同的字符串池對象,而且它會創建新的字符串對象,那麼這個對象將被分配在字符串池中,還是會在字符串池外的java堆中?

4。我假設字符串池的大小是固定的,那麼如果這個字符串池被完全佔用會發生什麼?gc會清理字符串池嗎?或者JVM可以擴展字符串池的大小?

回答

1

在當前的Sun/Oracle實現中,interned字符串將與Java類一起永久生成Java堆。字符串沒有單獨的存儲區。

該區域的最大尺寸可通過命令行選項(-XX:MaxPermGen或其他)進行配置。

通常concat將創建一個新的String分配爲任何其他對象。

如果PermGen填滿了,那麼你會得到一個OutOfMemoryError。 GC通常運行在PermGen上,但頻率較低。

所有這些都會在實現和版本之間發生變化。