Java webstart 堆转储

Posted

技术标签:

【中文标题】Java webstart 堆转储【英文标题】:Java webstart heap dump 【发布时间】:2011-06-07 12:24:21 【问题描述】:

我一直在尝试让 webstart 在内存不足时转储到堆转储中。

我知道 jmap/jconsole 的做法,但我真正想做的是将选项添加到 jnlp 文件并尝试了以下选项。

    j2se version="1.6+" java-vm-args="-server +HeapDumpOnOutOfMemoryError" max-heap-size="768M" j2se version="1.6+" java-vm-args="-server -XX:+HeapDumpOnOutOfMemoryError" max-heap-size="768M"

【问题讨论】:

使用这些选项运行程序会得到什么结果? 因为这涉及到操作客户端的计算机(将文件转储到本地计算机)。如果有围绕此选项的安全控制,我不会感到惊讶。它可能会被完全拒绝,或者可能需要额外的权限。 您是否尝试过通过添加例如-XX:HeapDumpPath=/tmp 来指定路径? 【参考方案1】:

根据Java 7 Release Notes,webstart 应用程序 (RFE: 6664424) 现在支持 -XX:+HeapDumpOnOutOfMemoryError 选项。

【讨论】:

有人知道堆文件是创建的吗?【参考方案2】:

当您将此选项放在 jnlp 文件中时,它肯定不起作用。有一个允许选项列表,其他选项将被忽略。您可以在documentation 中查看可用的 JVM 选项列表。

请注意,这个想法是最终用户将在他的计算机上运行您的应用程序。你会如何处理他的 comp 上的堆转储?它可能是世界上运行您的应用程序的任何人。如果允许您通过 JNLP 文件对最终用户 JVM 执行此操作,那将没有多大意义。

我能想到的唯一情况是您可以访问那台计算机并且您可以稍后检查转储。在这种情况下(您作为最终用户请求转储),如果您绕过浏览器中 jnlp 文件的自动运行并通过javaws 命令自己运行它,实际上是可能的。我已采取并导致成功的步骤如下(假设 jnlp 文件是 testOOM.jnlp 并且您在 Windows 上):

    下载 JNLP 文件 从命令行导航到包含 JNLP 文件的目录 执行javaws -verbose -J-XX:+HeapDumpOnOutOfMemoryError testOOM.jnlp

使用它,应用程序将以与浏览器相同的方式启动。但是请注意-J 选项,它允许您向JVM 提供JVM 选项。这没关系,因为请求转储的是 ebd 用户客户端。

OutOfMemoryError 上,堆转储将存储在您运行javaws 命令的同一目录中。

【讨论】:

非常感谢,我们正在内部分发,所以我们可以实际获取转储,看看我们是否可以获取脚本来执行它 开发人员可能希望 webstart 应用程序生成堆转储对我来说非常有意义。您是对的,在具有大量用户且开发人员没有直接联系的生产应用程序中,这将是无用的。但是,在开发过程中,有 beta 用户、测试用户和开发团队中的用户。这是我的情况......如果生成堆转储文件,他们足够精明,可以将堆转储文件提供给我。拥有这个选项会非常有用,对我来说很有意义。

以上是关于Java webstart 堆转储的主要内容,如果未能解决你的问题,请参考以下文章

捕获系统堆转储数据关闭

了解 Java 堆转储

解析堆转储文件

用于分析大型 Java 堆转储的工具

分析大型 Java 堆转储 - 内存错误

在大型 Java 堆转储中查找内存泄漏的方法