爲何會出現相似這樣的消息提示'CodeCache is full, Compiler has been disabled'?編程
JVM JIT生成了編譯後的代碼,而且將其存儲在名爲'CodeCache'的內存區域中。 大部分平臺上CodeCache的默認最大內存大小是: 48M.若是任何一個應用須要編譯大量的方法(函數)會致使CodeCache堆積大量的編譯後的代碼。當滿了的時候, 編譯器會被禁止進一步方法編譯, 而且會打印相似以下的日誌信息:函數
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 [0xffffffff77400000, 0xffffffff7a390000, 0xffffffff7a400000) total_blobs=11659 nmethods=10690 adapters=882 free_code_cache=909Kb largest_free_block=502656性能
但上述狀況出現時, JVM 可能會清除和清洗這個空間以便CodeCache有更多的空間。有個JVM option: UseCodeCacheFlushing, 它能夠用來控制清洗CodeCache, 可以讓JVM調用一個緊急的flushing 來丟棄(清洗)那些更早的編譯的代碼(nmethods),這樣CodeCache就有更多可用空間。除此以外, 它也會禁止編譯器, 直到可用空間編程多餘配置的CodeCacheMinimumFreeSpace, CodeCacheMinimumFreeSpace選項的默認值爲500KB。線程
在jdk6中, UseCodeCacheFlushing 會被設置爲false,可是在jdk7u4的時候默認會開啓這個flushing 功能。這意味着jdk6中, 當CodeCache區域被填滿的時候, 該區域不會被主動清除和flushing,這樣會致使編譯被禁止, 而在jdk7u4中,CodeCache填滿的時候, 緊急flushing會被啓用。在jdk7u4中默認開啓這個選項會讓與CodeCache相關的問題暴露出來。接下來有2個被熟知的問題就是關於CodeCache flushing:日誌
a) 通過緊急flushing,使CodeCache佔有內存大小降低到幾乎一半的時候,編譯器可能不會重啓。。。code
b) 緊急flushing 可能會大量消耗CPU資源, 這是因爲編譯器線程會致使全局性能降低。內存
性能問題、編譯器不能從新工做已經在jdk8中得以解決。爲了維護jdk7u4及以上版本,能夠用ReservedCodeCacheSize選項增長CodeCache內存大小,其餘的解決方案就是禁止CodeCache flushing: -XX:-UseCodeCacheFlushing。資源