什么是ReservedCodeCacheSize和InitialCodeCacheSize?

Rag*_*ghu 82 java jvm jvm-hotspot

有人能说明一下JVM选项是什么ReservedCodeCacheSizeInitialCodeCacheSize是谁?特别是何时/为什么我要改变它?我如何确定合适的尺寸?

这就是文档所说的:

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

jeh*_*eha 72

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
Run Code Online (Sandbox Code Playgroud)

接下来会更糟糕的是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编译器失败的风险)

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

  • @axel22:这些值实际上取决于平台和JVM版本; 来自Sun JVM的doc的值:`保留代码高速缓存大小(以字节为单位) - 最大代码高速缓存大小.[Solaris 64位,amd64和-server x86:48m; 在1.5.0_06及更早版本中,Solaris 64位和amd64:1024m.]`不知道OpenJDK值.适度的增加应该足够了(早先设定的1024米超出了善恶). (3认同)

Ani*_*451 12

@jeha回答了我想从这个问题中知道的一切,除了设置参数的值.因为我没有编写我正在部署的代码,所以我对它的内存占用空间没有多少可见性.

但是,您可以使用jconsole附加到正在运行的java进程,然后使用"Memory"选项卡查找代码缓存大小.为了完整起见,步骤是(Linux VM环境,虽然我确定其他环境类似):

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

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

    本.


    默认情况下1024 MB可能是过度的,但默认情况下48 MB似乎没有...