什么是ReservedCodeCacheSize和InitialCodeCacheSize?


86

有人能说明一下JVM选项是什么ReservedCodeCacheSizeInitialCodeCacheSize是谁?具体来说,何时/为什么要更改?如何确定合适的尺寸?

这就是文档所说的:

-XX:ReservedCodeCacheSize = 32m保留的代码缓存大小(以字节为单位)-最大代码缓存大小。[Solaris 64位,amd64和-server x86:2048m;在1.5.0_06和更早版本中,Solaris 64位和and64:1024m。]


2
这篇文章的OP写到:> -XX:ReservedCodeCacheSize = 32m保留的代码缓存大小(以字节为单位)-最大代码缓存大小。[Solaris 64位,amd64和-server x86:48m;在1.5.0_06及更早版本的Solaris 64位和and64:1024m中。]我只想更正提到的在48m处的上限必须是错字。2048m
Lasse Aagren

Answers:


73

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

何时设置此选项?

  1. Hotspot编译器出现故障时
  2. 减少JVM所需的内存(并因此冒着JIT编译器故障的风险)

通常,您不会更改此值。我认为默认值可以很好地平衡,因为仅在极少数情况下(根据我的经验)才会出现此问题。


1
真好 默认值是多少,如果看到“ CodeCache已满”,应该将其增加多少。警告?
2011年

3
@ axel22:值实际上取决于平台和JVM版本;具体取决于平台和JVM版本。Sun JVM的文档中的值: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 2011年

12

@jeha回答了我想从该问题中了解的一切,除了将参数设置为什么值。由于我没有编写要部署的代码,因此对其内存占用没有太多了解。

但是,您可以使用jconsole附加到正在运行的Java进程,然后使用“内存”选项卡查找代码缓存的大小。为了完整起见,这些步骤是(Linux VM环境,尽管我确定其他环境与此类似):

  1. 在计算机上启动jconsole
  2. 找到正确的进程ID并将jconsole附加到该ID(这将需要一些时间)
  3. 导航到“内存”标签
  4. 从“图表:”下拉列表中,选择“内存池“代码缓存””
  5. 同样,刷新屏幕可能需要一些时间,然后您会看到类似以下内容: jconsole代码缓存映像

    如您所见,我的代码缓存使用了大约49 MB。此时,我仍然具有默认的文档(和@jeha)为48 MB。当然,这是增加设置的巨大动力!


    默认情况下1024 MB可能超出了它的要求,但是默认情况下48 MB似乎正在执行它。


好建议...。我正在尝试-J-XX:ReservedCodeCacheSize = 512m
MarcoZen 2015年

Netbeans不会以512m开头,而要以256m
开头

经过大约2天的测试,我可以说该设置没有显示任何/任何显着的改进,而是使netbeans变得更加轻松。我最终只是删除了它。
MarcoZen 2015年

3

来自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,它们全部使用的代码缓存比以前多四倍。


0

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

以下是jdk7u4 +中与CodeCache刷新有关的两个已知问题:

  1. 即使在紧急刷新后CodeCache占用率下降到将近一半,编译器也可能无法重新启动。
  2. 紧急刷新可能会导致编译器线程占用大量CPU,从而导致整体性能下降。

JDK8中已解决了该性能问题以及再次无法重新启用编译器的问题。要解决JDK7u4 +中的这些问题,我们可以使用ReservedCodeCacheSize选项来增加代码缓存的大小,方法是将其设置为大于编译代码占用空间的值,以使CodeCache永远不会变满。另一个解决方案是使用-XX:-UseCodeCacheFlushing JVM选项禁用CodeCache刷新。

上述问题已在JDK8及其更新中修复。

因此,对于在JDK 6(禁用代码刷新)和7上运行的系统,这些信息可能值得一提。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.