92

有人可以解释一下JVM选项是什么吗ReservedCodeCacheSizeInitialCodeCacheSize具体来说,我何时/为什么要更改它?我如何确定合适的尺寸是多少?

这就是文档所说的:

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

4

4 回答 4

77

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

何时设置此选项?

  1. 当热点编译器失败时
  2. 减少 JVM 所需的内存(因此有 JIT 编译器失败的风险)

通常你不会改变这个值。我认为默认值非常平衡,因为这个问题仅在极少数情况下发生(根据我的经验)。

于 2011-09-22T19:22:29.483 回答
13

@jeha 回答了我想从这个问题中了解的所有内容,除了将参数设置为什么值。由于我没有编写我正在部署的代码,因此我对它所拥有的内存占用量没有太多了解。

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

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

    如您所见,我的代码缓存使用了大约 49 MB。在这一点上,我仍然拥有文档(和@jeha)所说的默认值是 48 MB。当然是我增加设置的一个很大的动力!

    本。


    默认情况下 1024 MB 可能过度,但默认情况下 48 MB 似乎不足...

于 2014-06-03T11:37:20.293 回答
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 需要额外的代码缓存。到目前为止,我们已经将大约 10 个服务切换到 JRE 8,所有这些服务都使用了大约 4 倍于以前的代码缓存。

于 2016-09-15T15:36:43.377 回答
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 Flushing。

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

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

于 2016-10-04T17:51:38.820 回答