什么是ReservedCodeCacheSize和InitialCodeCacheSize?

时间:2011-09-22 10:17:27

标签: java jvm jvm-hotspot

有人可以解释一下JVM选项ReservedCodeCacheSizeInitialCodeCacheSize是什么吗?特别是何时/为什么我要改变它?我如何确定合适的尺寸?

这就是文档所说的:

  

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

4 个答案:

答案 0 :(得分:69)

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编译器失败的风险)
  3. 通常你不会改变这个值。我认为默认值非常均衡,因为这个问题仅在极少数情况下发生(在我的经验中)。

答案 1 :(得分:12)

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

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

  1. 在您的计算机上启动jconsole
  2. 找到正确的进程ID并将jconsole附加到它(这将需要一些时间)
  3. 导航到'记忆'标签
  4. 来自'图表:'下拉列表,选择内存池"代码缓存"'
  5. 同样,屏幕刷新可能需要一些时间,然后您应该看到类似的内容: jconsole code cache image

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

    本。


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

答案 2 :(得分:2)

来自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,并且所有这些服务使用的密码量比以前多四倍。

答案 3 :(得分:0)

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

  

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

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

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

         

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

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

相关问题