有人可以解释一下JVM选项是什么吗ReservedCodeCacheSize
?InitialCodeCacheSize
具体来说,我何时/为什么要更改它?我如何确定合适的尺寸是多少?
这就是文档所说的:
-XX:ReservedCodeCacheSize=32m 保留代码缓存大小(以字节为单位)- 最大代码缓存大小。[Solaris 64 位、amd64 和 -server x86:2048m;在 1.5.0_06 及更早版本中,Solaris 64 位和 and64:1024m。]
有人可以解释一下JVM选项是什么吗ReservedCodeCacheSize
?InitialCodeCacheSize
具体来说,我何时/为什么要更改它?我如何确定合适的尺寸是多少?
这就是文档所说的:
-XX:ReservedCodeCacheSize=32m 保留代码缓存大小(以字节为单位)- 最大代码缓存大小。[Solaris 64 位、amd64 和 -server x86:2048m;在 1.5.0_06 及更早版本中,Solaris 64 位和 and64:1024m。]
ReservedCodeCacheSize
(and InitialCodeCacheSize
) 是 Java Hotspot 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
。
何时设置此选项?
通常你不会改变这个值。我认为默认值非常平衡,因为这个问题仅在极少数情况下发生(根据我的经验)。
@jeha 回答了我想从这个问题中了解的所有内容,除了将参数设置为什么值。由于我没有编写我正在部署的代码,因此我对它所拥有的内存占用量没有太多了解。
但是,您可以使用 jconsole 附加到正在运行的 java 进程,然后使用“内存”选项卡找出代码缓存大小。为了完整起见,步骤是(Linux VM 环境,尽管我确信其他环境类似):
同样,刷新屏幕可能需要一些时间,然后您应该会看到如下内容:
如您所见,我的代码缓存使用了大约 49 MB。在这一点上,我仍然拥有文档(和@jeha)所说的默认值是 48 MB。当然是我增加设置的一个很大的动力!
本。
默认情况下 1024 MB 可能过度,但默认情况下 48 MB 似乎不足...
Indeed 工程团队的良好学习经历以及他们在迁移到 jdk 8 时面临的挑战。
http://engineering.indeedblog.com/blog/2016/09/job-search-web-app-java-8-migration/
结论:JDK 8 比 JDK 7 需要更多的代码缓存
JRE 8 的默认代码缓存大小约为 250MB,大约是 JRE 7 的 48MB 默认值的五倍。我们的经验是 JRE 8 需要额外的代码缓存。到目前为止,我们已经将大约 10 个服务切换到 JRE 8,所有这些服务都使用了大约 4 倍于以前的代码缓存。
来自https://blogs.oracle.com/poonam/entry/why_do_i_get_message:
以下是 jdk7u4+ 中关于 CodeCache 刷新的两个已知问题:
- 即使在紧急刷新后 CodeCache 占用率下降到几乎一半后,编译器也可能不会重新启动。
- 紧急刷新可能会导致编译器线程的 CPU 使用率过高,从而导致整体性能下降。
这个性能问题,以及编译器没有重新启用的问题已在 JDK8 中得到解决。要在 JDK7u4+ 中解决这些问题,我们可以使用 ReservedCodeCacheSize 选项来增加代码缓存大小,方法是将其设置为大于编译代码占用空间的值,这样 CodeCache 就永远不会变满。另一个解决方案是使用 -XX:-UseCodeCacheFlushing JVM 选项禁用 CodeCache Flushing。
上述问题已在 JDK8 及其更新中得到修复。
因此,对于在 JDK 6(禁用代码刷新)和 JDK 7 上运行的系统,这些信息可能值得一提。