2

我在 Java 应用程序启动命令行之一中看到以下参数(IBM JVM)-Xcodecache。

虽然直观地我知道这个参数控制代码模块缓存的大小,但我无法在任何文档中找到这个参数的描述。

此外,此参数与使用不同设置完成的 servlet 缓存有何关系?感谢您的帮助。

4

2 回答 2

2

看看这个文档。

看起来 IBM 代码缓存是它存储从类生成的本机 JIT 编译代码的地方。JVM 将其存储在与其其他资源不同的内存块中。

对于许多应用程序来说,一旦大多数方法被 JIT 编译,这个“代码缓存”内存就会相当稳定。 IBM JVM 很聪明地知道它是如何做到这一点的,并试图只使用比它需要的多一点的内存。 但是,在 JVM 生命周期的早期,当方法仍在 JIT 编译时,或者当代码生成新类或使用反射时,这些内存将被消耗。当 JVM 确定它在当前分配的代码缓存中没有足够的空间时,它将分配一个新块来增加大小。该-Xcodecache参数设置分配的这些新块的大小。

这是链接文档中的相关段落:

JIT 编译器智能地使用内存。初始化代码缓存时,它消耗的内存相对较少。随着越来越多的方法被编译为本机代码,代码缓存会动态增长以适应程序的需要。以前被丢弃或重新编译的方法占用的空间被回收和重用。当代码缓存的大小达到预定义的上限时,它会停止增长。JIT 编译器将停止所有未来编译方法的尝试,以避免耗尽系统内存并影响应用程序或操作系统的稳定性。

文档说默认值是特定于体系结构的,这是有道理的,因为如果您运行 64 位或 32 位系统,您可能希望分配不同大小的块。当您想要调整此值时,您正在运行一个定期将新类加载到 JVM 中的应用程序。在这种情况下,您可能希望增加该值,以减少新分配发生的频率。但是,您不应该将其设置得太高,因为您不想分配比您将使用的更多的内存。该文件表明

调整最佳大小的合理起点是 (totalNumberByteOfCompiledMethods * 1.1)。

于 2013-08-02T20:05:30.623 回答
0

IBM 文档中读取,您可以拥有多少 JIT 代码:

编译后的代码被放入JVM进程空间的一部分,称为代码缓存;该方法在代码缓存中的位置被记录下来,以便将来调用它时会调用已编译的代码。

于 2013-08-02T20:04:52.690 回答