Java WebStart堆转储

7
我一直在尝试让Webstart在内存耗尽时转储到堆转储中。我知道可以使用jmap/jconsole的方法来完成,但我真正想做的是将选项添加到jnlp文件中,并尝试了以下选项。
  1. j2se version="1.6+" java-vm-args="-server +HeapDumpOnOutOfMemoryError" max-heap-size="768M"
  2. j2se version="1.6+" java-vm-args="-server -XX:+HeapDumpOnOutOfMemoryError" max-heap-size="768M"
请注意,以上内容保留了HTML标签。

1
当您使用这些选项运行程序时,会得到什么结果? - David Weiser
由于这涉及操作客户端计算机(将文件转储到本地计算机),如果存在安全控制,我不会感到惊讶。这个选项可能完全被拒绝,或者可能需要额外的权限。 - jtahlborn
你尝试过通过添加例如-XX:HeapDumpPath=/tmp来指定路径吗? - Jörn Horstmann
2个回答

5

有人知道堆文件是在哪里创建的吗? - Emmanuel Bourg

3
如果您将此选项放在jnlp文件中,它肯定不起作用。有一系列允许的选项,其他的选项将被忽略。您可以在文档中查看可用JVM选项列表。
请注意,想法是最终用户会在他的计算机上运行您的应用程序。您会在他的电脑上处理堆转储吗?可能是世界上任何人都在运行您的应用程序。如果您通过JNLP文件允许使用端用户JVM进行这样的操作,这将毫无意义。
我只能想到一种情况,那就是您可以访问该计算机并稍后检查转储。在这种情况下(您作为最终用户请求转储),如果您绕过浏览器的jnlp文件自动运行并通过javaws命令自己运行它,实际上是可能的。我采取的步骤如下(假设jnlp文件为testOOM.jnlp,您正在Windows上):
1. 下载JNLP文件 2. 从命令行导航到包含JNLP文件的目录 3. 执行javaws -verbose -J-XX:+HeapDumpOnOutOfMemoryError testOOM.jnlp 使用此方法启动应用程序的方式与从浏览器中启动相同。但是请注意-J选项,它允许您向JVM提供JVM选项。这很好,因为请求转储的是最终用户客户端。
当出现OutOfMemoryError时,堆转储将存储在您从中运行javaws命令的同一目录中。

非常感谢,我们正在内部分发,因此我们实际上可以获取转储文件,将看看是否可以获得执行脚本的方式。 - benjipete
作为一名开发人员,我觉得开发者可能希望WebStart应用程序生成堆转储。你说得对,在具有许多用户且开发者无法直接联系的生产应用程序中,这将是无用的。然而,在开发过程中,存在测试用户、Beta用户和也在开发团队中的用户。这就是我的情况...如果生成了堆转储文件,他们足够精明,可以将其发送给我。拥有此选项将非常有用,并且对我来说非常合理。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接