排除 JVM 堆大小设置未传播到应用程序的故障

Posted

技术标签:

【中文标题】排除 JVM 堆大小设置未传播到应用程序的故障【英文标题】:Troubleshooting JVM heap size setting not propagating to application 【发布时间】:2013-07-05 10:23:56 【问题描述】:

假设您有一个 Windows 客户端,您已通过 javacpl.exe 将 JVM 配置为具有更大的最大堆大小,例如 -Xmx1024m。如果您正在运行的应用程序(在 Web 浏览器中)仍然抱怨内存大小不高于 value Y,这是一个硬编码到应用程序中要检查的值,我们假设我们知道这个检查是有效的,并且正确,可以采取哪些步骤来查看为什么有问题的应用程序没有“获取”这个修改后的堆大小设置?

edit 一个可能的原因是如果您将 32 位 JRE 设置为超过 2 Gb(或更多)的内存,因为它不会处理它。 1024 应该传播,而我解决此问题的方法是简单地禁用我在系统上找到的不同 JRE,直到我发现正在使用哪个 JRE。

【问题讨论】:

【参考方案1】:

您需要验证哪些JVM参数在启动期间被传递到VM。

最简单的方法是运行jconsole,它将附加到正在运行的VM,您可以在其中查看所有启动参数、当前堆大小等。jconsole 附带您的 VM 发行版,您可以在已安装的 JVM_HOME/bin/ 目录中找到它。

另一个选项是启用 JVM 日志记录 -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log,jvm.log 将再次显示所有启动脚本。

另外,尝试将-Xmx-Xms 设置为相同的值,这样初始堆大小将是您想要的大小。

【讨论】:

jconsole是JDK的一部分,我忘了说我们这里只处理JRE,没有安装JDK的可能。您可以在 JRE 设置中启用一个控制台,但这似乎没有就我的问题提供任何有用的信息。 然后,您可以启用日志记录。此外,在 linux 中,您可以使用ps -ef | grep <my_jvm-pid>,这也会显示启动参数。您还可以在另一台机器上运行 jconsole 并远程连接。 不确定您所说的日志记录是什么意思,但可以在 JRE 中启用“控制台”,它会弹出一个窗口,其中包含一些信息(其中包括版本),但没有关于参数的信息显示在这里。 记录我的意思是您在启动 VM 时传递的 -XX:LogFile=jvm.log VM 参数。

以上是关于排除 JVM 堆大小设置未传播到应用程序的故障的主要内容,如果未能解决你的问题,请参考以下文章

性能测试之JVM的故障分析工具VisualVM

在 IntelliJ 中从 sbt 控制台设置 JVM 堆大小

JVM6聊聊JVM常用参数设置

OpenGL 纹理未显示的常见故障排除步骤是啥?

launch4j:通过命令行覆盖默认 JVM 堆大小

减少 JVM 中未使用的堆大小