【问题标题】:Resolving java.lang.OutOfMemoryError: Java heap space解决 java.lang.OutOfMemoryError: Java 堆空间
【发布时间】:2011-11-05 12:44:01
【问题描述】:

正如标题所示,我在线程中遇到了这个错误。

有问题的 LOC 如下所示:



for (int i = 0; i < objectListSize; i++) {
   logger.INFO("Loop repeat: "+i+" ...", true);
   final Double discreteScore = sp.getDouble(superPeerSocket);
   final int expectedObjectIDs = sp.getInteger(superPeerSocket);
   final String discreteObjects[] = new String[expectedObjectIDs];
   for ( int j = 0; j < expectedObjectIDs; j++)
      discreteObjects[j] = sp.getString(superPeerSocket);
   htPlus.attachInitialDiscreteList2L1(discreteScore, discreteObjects); 
}

最后的 String distinctObjects[] 声明是我得到错误的地方。我在一个线程中运行这段代码。当我得到这个时,我有两个线程当前处于活动状态。我还尝试使用 Eclipse 中的 MAT 工具。这是一个包含一些图表文件的链接: PLC chart files (dropbox URL)
如果有人对这个问题有任何想法,我将不胜感激。 P.S.:我正在考虑删除循环,尽管它在第一次循环传递中失败了。
(程序失败时我在输出中得到这个)


Expected data size: 10
Repeat: 0 ...
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid3793.hprof ...
Heap dump file created [1404020 bytes in 0.015 secs]
Exception in thread "1" java.lang.OutOfMemoryError: Java heap space
    at planetlab.app.factory.Worker$15.run(Worker.java:796)
    at java.lang.Thread.run(Thread.java:662)

无关紧要的:
在堆栈溢出中发布帖子时,代码格式不正确/预期错误是怎么回事?我花了 15 分钟才弄清楚该怎么做 :@ :S :@

【问题讨论】:

  • 您应该在创建数组之前记录expectedObjectIDs 的值...
  • 您使用的-Xmx 的值是多少?堆空间使用看起来很小。回复:代码格式化,stackoverflow.com/editing-help
  • 那么expectedObjectIDs的值是多少?
  • @Jon Skeet:我真笨!不知道我怎么从来没想过记录价值!谢谢! :) (at) Matt Ball:是的,我已经看到了,但仍然不清楚你应该怎么做(我相信这样说会更简洁:突出显示代码然后按 Ctrl+K - 或者我很奇怪:) :P :)
  • 历史记录:值为 1077084160 :P

标签: java multithreading eclipse memory-management memory-leaks


【解决方案1】:

每个 Java 程序都在沙箱中运行。虽然您的操作系统可能有 10 GB 的可用 RAM,但您的应用可能只有 128 MB。

您需要使用 -Xms -Xmx 参数确保您的应用程序有足够的内存分配给 JVM。 -Xms 表示最小值,-Xmx 表示最大值

在 cmets 中建议您的 expectedObjectIDs 似乎有点高。我当然会检查一下。但是,您可以使用以下代码来了解内存使用情况和可用内存。使用该信息,您可以相应地调整您的 -Xms -Xmx。

祝你好运!

Runtime runtime = Runtime.getRuntime();  

long maxMemory = runtime.maxMemory();  
long allocatedMemory = runtime.totalMemory();  
long freeMemory = runtime.freeMemory();  

System.out.println("free memory: " + freeMemory / 1024);  
System.out.println("allocated memory: " + allocatedMemory / 1024);  
System.out.println("max memory: " + maxMemory /1024);  
System.out.println("total free memory: " +   
   (freeMemory + (maxMemory - allocatedMemory)) / 1024);   

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2021-09-09
    • 2011-10-24
    • 2017-04-22
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多