首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存不足异常在我的代码中

内存不足异常在我的代码中
EN

Stack Overflow用户
提问于 2010-12-13 01:07:49
回答 6查看 1.5K关注 0票数 2

作为Oracle db压力测试的一部分,我正在运行一段长时间的代码,并使用java版本"1.4.2“。简而言之,我所做的是:

代码语言:javascript
复制
while(true)
{
    Allocating some memory as a blob
    byte[] data = new byte[1000];
    stmt = fConnection.prepareStatement(query); // [compiling an insert query which uses the above blob]
    stmt.execute();  // I insert this blob-row in the database. 
stmt.close();

}

现在我想做8-10个小时的测试。然而,显然,在插入了大约1500万张唱片后,我进入了java.lang.OutOfMemoryError

我是用-Xms512m -Xmx2g来运行这个的。我尝试使用更高的值,但我似乎没有那么多硬件,我也不认为它是req:

代码语言:javascript
复制
    java -Xms512m -Xmx4g -jar XX.jar
    Invalid maximum heap size: -Xmx4g
    The specified size exceeds the maximum representable size.
    Could not create the Java virtual machine.
    java -Xms2g -Xmx3g -jar XX.jar
    Error occurred during initialization of VM
    Could not reserve enough space for object heap
    Could not create the Java virtual machine.

我把它作为多线程程序运行。因此,arnd 10个线程正在执行插入。

有什么办法我可以绕过这个程序可能没有黑客的方式。如果我决定用15到20小时而不是8到10小时。

编辑:添加了stmt.close,因为我已经在代码中使用它了。基于评论的一些更改

谢谢

对不起,不能发布NDA的bec代码

EN

回答 6

Stack Overflow用户

发布于 2010-12-13 01:35:31

基本上,我认为你说错了话:

  • JVM / GC将设法释放不可访问的对象,不管分配它们的速度有多快。如果您运行的是经典的非并发GC,那么JVM只需停止执行其他操作,直到GC已经释放了内存。如果您将JVM配置为使用并发GC,它将尝试同时运行GC和普通工作线程.如果内存不足,则恢复为“停止一切并收集”行为。
  • 如果内存不足,是因为应用程序中的某些东西(或它正在使用的库/驱动程序)正在泄漏内存。换句话说,尽管应用程序不再需要对象,但还是有一些东西使对象保持可访问性。

正如注释所指出的,您需要系统地使用内存分析器/堆转储来解决这个问题。随机改变事物或将其归咎于GC是极不可能解决问题的。

(当您说“.我一直使用stmt.close()”时,我假设这意味着您的代码如下所示:

代码语言:javascript
复制
    PreparedStatement stmt = ... 
    try {
        stmt.execute();
        // ...
    } finally {
        stmt.close();
    }

如果不将close调用放入finally中,则可能不是每次调用close。特别是,如果在execute调用期间或在它与close调用之间抛出一些异常,那么close可能不会被调用.这将导致泄漏。)

票数 6
EN

Stack Overflow用户

发布于 2010-12-13 01:14:26

我觉得你应该加上

代码语言:javascript
复制
stmt.close();

因此,分配给preparedStatement的内存将被释放。

票数 1
EN

Stack Overflow用户

发布于 2010-12-13 01:56:46

如果您的代码或库中有漏洞,内存分析器(MAT)是一个基于Eclipse的免费应用程序,用于深入研究Java内存转储文件。说明包括如何让它为您删除转储文件。http://www.eclipse.org/mat/

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

https://stackoverflow.com/questions/4425106

复制
相关文章

相似问题

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