2011-09-22 120 views
71

有人可以請解釋什麼JVM選項ReservedCodeCacheSizeInitialCodeCacheSize是?具體何時/爲什麼我想要更改它?我如何確定合適的尺寸是多少?什麼是ReservedCodeCacheSize和InitialCodeCacheSize?

這就是文檔說:

-XX:ReservedCodeCacheSize =32米保留代碼緩存大小(以字節爲單位) - 最大碼緩存大小。 [Solaris 64位,amd64和-server x86:2048m;在1.5.0_06和更早,64位Solaris和and64:1024米]

+2

這篇文章的OP寫道:> -XX:ReservedCodeCacheSize = 32m預留代碼緩存大小(以字節爲單位) - 最大代碼緩存大小。 [Solaris 64位,amd64和-server x86:48m;在1.5.0_06和更早版本中,Solaris 64位和64位:1024m。]我只是想糾正在48m處提到的上限必須是錯字。這是2048米。 –

回答

66

ReservedCodeCacheSize(和InitialCodeCacheSize)是Java VM熱點的(剛剛在時間)編譯器的選項。基本上它爲編譯器的代碼緩存設置了最大大小。

緩存可以變得豐滿,從而導致類似如下的警告:

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. 
Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= 
Code Cache [0x000000010958f000, 0x000000010c52f000, 0x000000010c58f000) 
total_blobs=15406 nmethods=14989 adapters=362 free_code_cache=835Kb largest_free_block=449792 

隨後當Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated這糟糕得多。

何時設置此選項?

  1. 具有熱點編譯器故障時
  2. 以減少由JVM所需的存儲器(因此冒着JIT編譯器故障)

通常你不改變此值。我認爲默認值是非常好的平衡,因爲這個問題只發生在極少數情況下(在我的經驗中)。

+1

不錯。什麼是默認值,以及如果我們看到「CodeCache已滿」,它們應該增加多少。警告? – axel22

+2

@ axel22:這些值實際上取決於平臺和JVM版本; Sun JVM文檔中的值:'保留的代碼緩存大小(以字節爲單位) - 最大代碼緩存大小。 [Solaris 64位,amd64和-server x86:48m;在1.5.0_06及更早版本中,Solaris 64位和amd64:1024m。]'不知道OpenJDK值。適度增加應該是足夠的(早期設置爲1024m已經超出了良好的邪惡)。 – jeha

12

@jeha回答了我想從這個問題中知道的一切,除了設置參數的值。由於我沒有編寫我正在部署的代碼,因此我對它的內存佔用情況沒有太多的瞭解。

但是,您可以使用jconsole附加到您正在運行的java進程,然後使用'Memory'選項卡來查找代碼緩存大小。爲了完整起見,步驟是:(Linux的虛擬機環境,但我敢肯定,其他的環境很相似):

  1. 火起來的JConsole你的機器上
  2. 找到正確的進程ID和JConsole的附加到它(這將花幾分鐘時間)
  3. 導航到「記憶」選項卡
  4. 從「圖:」下拉列表中,選擇「存儲池‘代碼緩存’」
  5. 同樣,這可能需要一些時間屏幕刷新,然後你應該看到類似於: jconsole code cache image

    正如你所看到的,我的代碼緩存使用大約49 MB。在這一點上,我仍然有文檔(和@jeha)所說的默認值爲48 MB。當然,我有很大的動力來增加設置!

    本。


    1024 MB默認情況下可能是過度使用它,但默認情況下48 MB似乎在做... ...

+0

好的建議....我想用-J-XX:ReservedCodeCacheSize = 512m – MarcoZen

+0

Netbeans不會以512m開頭,256m – MarcoZen

+0

並且經過大約2天的測試後,我可以說該設置沒有顯示任何/任何顯着的改善,而不是netbeans醉意。我最終只是刪除它。 – MarcoZen

11

當JVM編譯代碼時,它在 代碼高速緩存中保存了一組彙編語言指令。代碼緩存具有固定大小,並且一旦填滿,JVM就不能編譯任何其他代碼。

通過-XX:ReservedCodeCacheSize = N標誌 (其中N是針對特定編譯器提及的默認值)設置代碼高速緩存的最大大小。代碼緩存爲 ,像JVM中的大多數內存一樣管理:存在初始大小( -XX:InitialCodeCacheSize = N)。代碼緩存大小的分配從最初的 大小開始並隨着緩存填滿而增加。代碼緩存的初始大小根據所使用的芯片架構和編譯器的不同而有所不同。調整緩存大小 發生在後臺,並不會真正影響性能,因此設置 ReservedCodeCacheSize大小(即設置最大代碼緩存大小)通常都是 。

默認情況下,對於64位服務器,Java 7大小爲48 MB(分層編譯爲96 MB)。在Java 8 for 64位服務器中,內存大小爲240 MB。

- 皮納基環礁

+2

用於提及Java 7/Java 8大小差異。我懷疑這是因爲分層編譯默認情況下是在Java 8中。 – jdv

+0

你是對的,分層編譯在1.7.40之後穩定下來,然後它們有一些問題。分層編譯可以輕鬆使用默認配置中的整個代碼緩存,因此他們將它提高到Java8的更安全級別。 –

1

從事實上的工程團隊和挑戰一個很好的學習經驗遷移爲JDK 8

http://engineering.indeedblog.com/blog/2016/09/job-search-web-app-java-8-migration/

結論,當他們面對:jdk的8需要更多的代碼緩存漢JDK 7

JRE 8的缺省codecache大小約爲250MB,大約比JRE 7的48MB默認值大五倍。我們的經驗是JRE 8需要額外的編碼緩存。到目前爲止,我們已經將大約10個服務切換到了JRE 8,並且所有這些服務使用的編碼緩存比以前多四倍。

0

https://blogs.oracle.com/poonam/entry/why_do_i_get_message

以下是jdk7u4兩個已知問題+關於CodeCache沖洗:

  1. 甚至CodeCache入住後的編譯器可能不會重新下降到幾乎一半緊急衝洗後。
  2. 緊急刷新可能會導致編譯器線程CPU使用率過高,導致整體性能下降。

JDK8解決了這個性能問題以及編譯器不能再次啓用的問題。要在JDK7u4 +中解決這些問題,我們可以使用ReservedCodeCacheSize選項增加代碼緩存大小,方法是將其設置爲大於編譯代碼足跡的值,以便CodeCache永遠不會變滿。解決此問題的另一個方法是使用-XX:-UseCodeCacheFlush JVM選項禁用CodeCache刷新。

上述問題已在JDK8及其更新中修復。

因此,對於在JDK 6上運行的系統(禁用代碼刷新)和7來說,這些信息可能值得一提。