我一直在设计一个Java服务器,通过PHP连接,它接受一系列的蛋白质链,并对每个蛋白质链执行计算。计算由外部Perl脚本处理,这些脚本将数据返回给Java,然后将数据插入到MySQL数据库中。
Java成功地执行Perl脚本并返回数据,问题在于MySQL插入数据。Java似乎正在抛出一个OutofMemory异常(耗尽堆空间)。在搜索了大多数解决方案后,似乎都涉及到“增加堆大小”,但问题是10条蛋白质链将堆大小增加到500 if,这似乎解决了这个问题,但如果再次输入20条链,堆大小将不得不增加,而增加1000条链(系统应该能够处理的)增加堆大小不是一种选择。
我的问题是这个。
发布于 2011-07-16 00:16:16
启用-XX:+HeapDumpOnOutOfMemoryError选项,当服务器耗尽内存时,使用月食垫这样的工具查看.hprof文件。MAT会告诉你谁在使用内存,它也会试图找出漏洞。
发布于 2011-07-16 00:27:04
在JVM中导致内存崩溃的不是MySQL --只有JVM中的操作才能做到这一点。
您的代码可能是“分块式”完成的,类似于以下伪代码:
List<ProteinResult> results = new ArrayList<ProteinResult>();
for (int i = 0; i < 1000; i++)
results.add(callPerl(proteins[i]));
for (ProteinResult pr : results)
db.execute("insert into ...", results);如果是这样的话,将其转换为“流样式”,它一次只做一件事情,并且不会在对象上停留的时间超过它必须的时间,这完全是可缩放的:
for (int i = 0; i < 1000; i++)
db.execute("insert into ...", callPerl(proteins[i])));如果以面值查看代码并不能给出答案,则可以使用JVM分析器查找哪些对象正在咀嚼内存,该分析器与正在运行的JVM挂钩,并且可以告诉您每秒创建了多少对象以及它们是什么类等。您的内存泄漏应该会为分析器找到大量线索。
这里有一个您可以查看的:JProfiler
https://stackoverflow.com/questions/6714394
复制相似问题