作为Oracle db压力测试的一部分,我正在运行一段长时间的代码,并使用java版本"1.4.2“。简而言之,我所做的是:
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:
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代码
发布于 2010-12-13 01:35:31
基本上,我认为你说错了话:
正如注释所指出的,您需要系统地使用内存分析器/堆转储来解决这个问题。随机改变事物或将其归咎于GC是极不可能解决问题的。
(当您说“.我一直使用stmt.close()”时,我假设这意味着您的代码如下所示:
PreparedStatement stmt = ...
try {
stmt.execute();
// ...
} finally {
stmt.close();
}如果不将close调用放入finally中,则可能不是每次调用close。特别是,如果在execute调用期间或在它与close调用之间抛出一些异常,那么close可能不会被调用.这将导致泄漏。)
发布于 2010-12-13 01:14:26
我觉得你应该加上
stmt.close();因此,分配给preparedStatement的内存将被释放。
发布于 2010-12-13 01:56:46
如果您的代码或库中有漏洞,内存分析器(MAT)是一个基于Eclipse的免费应用程序,用于深入研究Java内存转储文件。说明包括如何让它为您删除转储文件。http://www.eclipse.org/mat/
https://stackoverflow.com/questions/4425106
复制相似问题