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

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

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

【问题讨论】:

    标签: java web jvm


    【解决方案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 参数。
    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2017-03-10
    • 2020-10-27
    相关资源
    最近更新 更多