我已经扩展了一个基因组学查看器,其中包含约翰霍普金斯实验室要求的一些功能。当我从命令行运行应用程序时,我似乎没有内存问题 - 该应用程序已启动-Xmx750m。但是,当我使用以下堆设置运行与web-start应用程序相同的应用程序时:
<java initial-heap-size="67108864" max-heap-size="1205862400" version="1.5+"/>
一段时间后,应用程序崩溃并出现OutOfMemoryError:
ERROR [2011-01-12 16:28:22,437] [DefaultExceptionHandler.java:42] [AWT-EventQueue-0] Unhandled exception
java.lang.OutOfMemoryError
at java.util.zip.Inflater.init(Native Method)
at java.util.zip.Inflater.<init>(Unknown Source)
at java.util.zip.Inflater.<init>(Unknown Source)
本地应用程序和web-start应用程序之间没有区别,除了我已经签署了在web-start jnlp文件中调用的jar。 我试图用JConsole和YourKit Java Profiler连接到web-start应用程序。在每种情况下,我都通过调用HotSpotDiagnostic MBean的setVMOption操作来打开HeapDumpOnOutOfMemoryError属性;但是当应用程序崩溃时,不会生成堆转储。
在我看来,崩溃与在web-start下运行有关。我已经非常努力地在桌面应用上引起OutOfMemoryError - 通过减少内存(-Xmx250m);这导致应用程序暂停很长一段时间(多达5分钟),而可能是垃圾收集完成。但该应用程序总是在暂停后恢复 - 永远不会崩溃。
有人能告诉我在web-start下捕获OutOfMemoryError上的堆转储的方法吗?虽然,我怀疑我可能根本就没有用完堆。但至少它是一个开始的地方。
我在我的智慧结束 - 任何帮助将不胜感激。
我在Windows XP-SP2上运行Java 1.6.0_20-b02。
答案 0 :(得分:0)
我也在我的应用中看到了这个。在我的情况下,它是由损坏的JAR引起的。尝试签名的罐子仍然有效(尝试在winzip或其他拉链工具中打开它们 - 我最喜欢的是TotalCommander中的CTRL + PGDOWN ;-)
答案 1 :(得分:0)
我昨天解决了一个非常类似的问题,我通过调用Deflater.end()
解决了这个问题(请参阅this了解更多信息)。我在序列化期间遇到了OutOfMemoryError异常,但出于某些原因,只有在部署为webstart时 - 我无法在Eclipse或可执行jar中复制问题而不管Xmx。