Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
main java.lang.OutOfMemoryError:java堆空间_Java_Out Of Memory - Fatal编程技术网

main java.lang.OutOfMemoryError:java堆空间

main java.lang.OutOfMemoryError:java堆空间,java,out-of-memory,Java,Out Of Memory,我的代码是这样做的: for(SomeObject so : someObjects) { Blah b = so; NewObject n = dao.GetNO(b.23); } i、 它在每次迭代中都在for循环中创建一个新变量 这可能是内存不足问题的原因吗 Netbeans报告的错误: Caused by: java.lang.OutOfMemoryError: Java heap space at java.lang.StringCoding$StringDe

我的代码是这样做的:

for(SomeObject so : someObjects)
{
  Blah b = so;
  NewObject n = dao.GetNO(b.23);
}
i、 它在每次迭代中都在for循环中创建一个新变量

这可能是内存不足问题的原因吗

Netbeans报告的错误:

Caused by: java.lang.OutOfMemoryError: Java heap space
        at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:133)
        at java.lang.StringCoding.decode(StringCoding.java:173)
        at java.lang.String.<init>(String.java:443)
        at java.lang.String.<init>(String.java:515)
        at com.gargoylesoftware.htmlunit.WebResponseImpl.getContentAsString(WebResponseImpl.java:215)
        at com.gargoylesoftware.htmlunit.WebResponseImpl.getContentAsString(WebResponseImpl.java:205)
原因:java.lang.OutOfMemoryError:java堆空间
在java.lang.StringCoding$StringDecoder.decode(StringCoding.java:133)
在java.lang.StringCoding.decode(StringCoding.java:173)
位于java.lang.String。(String.java:443)
位于java.lang.String。(String.java:515)
在com.gargoylesoftware.htmlunit.WebResponseImpl.getContentAsString(WebResponseImpl.java:215)上
在com.gargoylesoftware.htmlunit.WebResponseImpl.getContentAsString(WebResponseImpl.java:205)上
竖立
这是一个java控制台应用程序,整个应用程序基本上运行一个in-forloop。

当您试图保留更多适合内存的对象时,内存不足。如果在循环中创建一个对象,一旦超出范围,它就会被垃圾收集

所以如果你写

for (.....){
   Object o = new Object();
}
-您永远不会持有一个以上的o实例,因此它不会成为原因(除非您将对它们的引用存储在其他地方,例如将它们放在循环范围之外的映射中)

您需要在代码中寻找保留更多引用的位置。从你的帖子中,不可能知道更多


BTW,您也可以考虑用JXM和-XMX选项(“java -x”来获取更多信息)来增加您在JVM中使用的内存量,这可能会使它运行,但这不会帮助您发现错误。由于您在netbeans内部运行,因此也可能内存不足,因为它运行在同一个JVM中。我不使用netbeans,但您可以检查并查看netbeans是否允许您派生一个新进程来运行您的程序(这样,您就不会在与netbeans共享内存时尝试运行,这一点并不小),或者尝试直接在命令行上运行。

当您试图保留更多适合内存的对象时,内存不足。如果在循环中创建一个对象,一旦超出范围,它就会被垃圾收集

所以如果你写

for (.....){
   Object o = new Object();
}
-您永远不会持有一个以上的o实例,因此它不会成为原因(除非您将对它们的引用存储在其他地方,例如将它们放在循环范围之外的映射中)

您需要在代码中寻找保留更多引用的位置。从你的帖子中,不可能知道更多


BTW,您也可以考虑用JXM和-XMX选项(“java -x”来获取更多信息)来增加您在JVM中使用的内存量,这可能会使它运行,但这不会帮助您发现错误。由于您在netbeans内部运行,因此也可能内存不足,因为它运行在同一个JVM中。我不使用netbeans,但您可以检查netbeans是否允许您派生一个新进程来运行您的程序(这样您就不会在与netbeans共享内存时尝试运行,因为内存不是很小),或者尝试直接在命令行上运行。

最有可能的情况是,您不小心在某个地方抓住了某些对象。通常的罪魁祸首是实现不佳的缓存,或其功能等效物

另一种可能是,无论你在做什么,你都没有足够的内存。Java以64MB的堆启动(至少Sun默认情况下是这样)。您可以使用
-xmx
参数对其进行更改

最后,我记得在1.4.X天中,如果垃圾收集(对于某些特定的垃圾收集器实现)花费了足够的时间(占总进程cpu时间的百分比),可能会导致OutOfMemoryError。截止值在90%范围内。我在近十年中见过一次,这是一个非常神经质的用例。可能不是这样,但也可能是这样。我不确定这种行为在现代Java中是否仍然存在


我的建议是:检查
dao.GetNO(…)
的实现,看看它是否会创建任何对象作为副作用,以及它们的生命周期是什么。

最有可能的情况是,您不小心在某处抓住了一些对象。通常的罪魁祸首是实现不佳的缓存,或其功能等效物

另一种可能是,无论你在做什么,你都没有足够的内存。Java以64MB的堆启动(至少Sun默认情况下是这样)。您可以使用
-xmx
参数对其进行更改

最后,我记得在1.4.X天中,如果垃圾收集(对于某些特定的垃圾收集器实现)花费了足够的时间(占总进程cpu时间的百分比),可能会导致OutOfMemoryError。截止值在90%范围内。我在近十年中见过一次,这是一个非常神经质的用例。可能不是这样,但也可能是这样。我不确定这种行为在现代Java中是否仍然存在


我的建议是:检查
dao.GetNO(…)
的实现,看看它是否会创建任何对象作为副作用,以及它们的生命周期是什么。

您是使用Java 5或更高版本运行,还是使用传统JVM之一?您可以尝试通过使用-XX:+heapdumponautofmemory武装Java命令行,或通过附加到进程并请求堆转储来跟踪OOM的原因。然后,您可以使用该工具打开转储并查看对象图,以查看程序中的对象是谁。MAT可以看到控制对象图的对象,因此非常清楚到底是什么在泄漏。查看堆栈跟踪没有帮助,并且可能会产生误导,因为程序某个位置的泄漏可能会导致其他位置的分配失败。

您是使用Java 5或更高版本运行,还是使用旧版JVM?你可以通过武装你来追查你OOM的原因