有人能说明一下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。]
Answers:
ReservedCodeCacheSize
(和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
。
何时设置此选项?
通常,您不会更改此值。我认为默认值可以很好地平衡,因为仅在极少数情况下(根据我的经验)才会出现此问题。
Reserved code cache size (in bytes) - maximum code cache size. [Solaris 64-bit, amd64, and -server x86: 48m; in 1.5.0_06 and earlier, Solaris 64-bit and amd64: 1024m.]
不知道OpenJDK值。适度增加就足够了(先前设置的1024m超出了正常范围)。
@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需要额外的代码缓存。到目前为止,我们已经将大约十种服务切换到了JRE 8,它们全部使用的代码缓存比以前多四倍。
来自https://blogs.oracle.com/poonam/entry/why_do_i_get_message:
以下是jdk7u4 +中与CodeCache刷新有关的两个已知问题:
- 即使在紧急刷新后CodeCache占用率下降到将近一半,编译器也可能无法重新启动。
- 紧急刷新可能会导致编译器线程占用大量CPU,从而导致整体性能下降。
JDK8中已解决了该性能问题以及再次无法重新启用编译器的问题。要解决JDK7u4 +中的这些问题,我们可以使用ReservedCodeCacheSize选项来增加代码缓存的大小,方法是将其设置为大于编译代码占用空间的值,以使CodeCache永远不会变满。另一个解决方案是使用-XX:-UseCodeCacheFlushing JVM选项禁用CodeCache刷新。
上述问题已在JDK8及其更新中修复。
因此,对于在JDK 6(禁用代码刷新)和7上运行的系统,这些信息可能值得一提。