什么是 ReservedCodeCacheSize 和 InitialCodeCacheSize?

2022-08-31 10:58:30

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

这是文档所说的:

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


答案 1

ReservedCodeCacheSize(and ) 是 Java Hotspot VM 的(即时)编译器的一个选项。基本上,它设置编译器代码缓存的最大大小。InitialCodeCacheSize

缓存可能会变满,从而导致如下警告:

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 编译器失败的风险)

通常不会更改此值。我认为默认值是相当平衡的,因为这个问题只在非常罕见的情况下发生(在我的经验中)。


答案 2

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

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

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

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

    本。


    默认情况下,1024 MB可能做得过头了,但默认情况下,48 MB似乎做得不够......


推荐