首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java/MySQL插入导致OutofMemory异常

Java/MySQL插入导致OutofMemory异常
EN

Stack Overflow用户
提问于 2011-07-16 00:08:48
回答 2查看 493关注 0票数 2

我一直在设计一个Java服务器,通过PHP连接,它接受一系列的蛋白质链,并对每个蛋白质链执行计算。计算由外部Perl脚本处理,这些脚本将数据返回给Java,然后将数据插入到MySQL数据库中。

Java成功地执行Perl脚本并返回数据,问题在于MySQL插入数据。Java似乎正在抛出一个OutofMemory异常(耗尽堆空间)。在搜索了大多数解决方案后,似乎都涉及到“增加堆大小”,但问题是10条蛋白质链将堆大小增加到500 if,这似乎解决了这个问题,但如果再次输入20条链,堆大小将不得不增加,而增加1000条链(系统应该能够处理的)增加堆大小不是一种选择。

我的问题是这个。

  • 为什么MySQL插入会导致堆填充,以及为什么JVM不清理多余的数据?MySQL查询不是准备好的语句,只是一个简单的INSERT和executeUpdate。我们使用的是驱动程序mysql-连接器-java-5.1.13-bin。
EN

回答 2

Stack Overflow用户

发布于 2011-07-16 00:16:16

启用-XX:+HeapDumpOnOutOfMemoryError选项,当服务器耗尽内存时,使用月食垫这样的工具查看.hprof文件。MAT会告诉你谁在使用内存,它也会试图找出漏洞。

票数 3
EN

Stack Overflow用户

发布于 2011-07-16 00:27:04

在JVM中导致内存崩溃的不是MySQL --只有JVM中的操作才能做到这一点。

您的代码可能是“分块式”完成的,类似于以下伪代码:

代码语言:javascript
复制
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);

如果是这样的话,将其转换为“流样式”,它一次只做一件事情,并且不会在对象上停留的时间超过它必须的时间,这完全是可缩放的:

代码语言:javascript
复制
for (int i = 0; i < 1000; i++)
    db.execute("insert into ...", callPerl(proteins[i])));

如果以面值查看代码并不能给出答案,则可以使用JVM分析器查找哪些对象正在咀嚼内存,该分析器与正在运行的JVM挂钩,并且可以告诉您每秒创建了多少对象以及它们是什么类等。您的内存泄漏应该会为分析器找到大量线索。

这里有一个您可以查看的:JProfiler

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6714394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档