JVM扫盲(三)

为何会出现相似这样的消息提示'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。资源

相关文章
相关标签/搜索