排除 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 堆大小设置未传播到应用程序的故障的主要内容,如果未能解决你的问题,请参考以下文章