我在其中一个Java应用程序启动命令行中看到以下参数(IBM JVM) -Xcodecache。
虽然直观地我明白这个参数控制代码模块的缓存大小,但我无法在任何文档中找到此参数的描述。
此外,此参数如何与使用不同设置完成的servlet缓存相关?感谢您的帮助。
答案 0 :(得分:2)
Take a look at this documentation.
看起来IBM codecache是存储从类生成的本机JIT编译代码的地方。 JVM将其存储在与其他资源不同的内存块中。
对于许多应用程序,一旦大多数方法被JIT编译,这个“codecache”内存将相当稳定。 The IBM JVM is smart about how it does this and tries to only use a litle bit more memory than it needs.但是,在JVM生命周期的早期,当方法仍在进行JIT编译时,或者当代码生成新类或使用反射时,将消耗此内存。当JVM确定它在当前分配的代码缓存中没有足够的空间时,它将分配一个新的块来增加大小。 -Xcodecache
参数设置分配的这些新块的大小。
这是链接文档的相关段落:
JIT编译器智能地使用内存。当代码缓存是 初始化后,它消耗的内存相对较少。随着更多的方法 编译成本机代码,代码缓存动态增长 满足该计划的需要。以前占用的空间 丢弃或重新编译的方法被回收并重复使用。当大小 代码缓存达到预定义的上限,它停止增长。 JIT编译器将停止将来编译方法的所有尝试 避免耗尽系统内存并影响系统的稳定性 应用程序或操作系统。
文档说默认值是特定于体系结构的,这是有道理的,因为如果运行的是64位或32位系统,可能需要分配不同大小的块。当您想要调整此值时,就是在运行定期将新类加载到JVM中的应用程序时。在这种情况下,您可能希望增加该值,以便不太频繁地发生新分配。但是,您不应该将此设置得太高,因为您不希望分配比您将使用的内存更多的内存。文档建议
调整最佳尺寸的合理起点是 (totalNumberByteOfCompiledMethods * 1.1)。
答案 1 :(得分:0)
从IBM docs读取,看起来你可以拥有多少JIT代码:
已编译的代码放在JVM进程空间的一部分中 称为代码缓存;代码中方法的位置 记录缓存,以便将来调用它将调用已编译的 代码。