2013-04-28 37 views
1

当我跑我的hyprgraph施工中的应用,我得到这个异常Unix的交换和Java堆空间异常回避

java.lang.OutOfMemoryError: Java heap space 

我使用Ubuntu 12.04 命令free -m几分钟的异常之前的输出是:

[email protected]:~$ free -m 
     total  used  free  shared buffers  cached 
Mem:   3939  2672  1266   0   80  610 
-/+ buffers/cache:  1981  1957 
Swap:   7328   65  7263 

我注意到,该交换不使用足够 它可以利用它来避免这种异常

+1

使用-Xm开关增加java堆空间 – Satya 2013-04-28 15:02:55

回答

3

Java虚拟机会施加一些限制,您可以在启动java命令时增加堆栈和堆的限制。

显然,你必须通过类似

java -Xmx6g myprogram 

其中6克应该限制你堆到6吉布

Increase heap size in Java

1

可能是由于多种原因(例如堆耗尽由于的内存不足错误到程序中的内存泄漏,你的程序需要更多的内存运行,本地内存耗尽等)。找出OutOfMemory原因的最好方法是在JVM出去OutOfMemory时生成一个heapdump。您可以使用-XX:+ HeapDumpOnOutOfMemoryError选项来实现此目的。

一旦heapdump生成,您可以使用eclipse内存分析器来分析堆。

http://www.eclipse.org/mat/

以确定分析是否有内存泄漏或你的程序确实需要额外的内存。如果需要额外的内存,您可以使用-Xmx选项配置相同的内存。

0

默认限制是主存储器的1/4。如果你增加你的最大值,你可以使用更多的。

你要注意:在使用交换空间了JVM的应用

  • 是一个非常糟糕的主意,因为GC将杀死你的过程中如果你的机器。
  • 购买更多的内存可能是值得考虑的,你可以购买64 GB的300美元。

顺便说一句我买了一台PC给我8岁的儿子,他自己建造。 ;)它的成本是240英镑,它有8 GB的内存。

+0

为什么swap会是个坏主意? – LtWorf 2014-03-28 10:51:09

+0

@LtWorf GC试图访问它至少两次。一旦开始交换堆,GC可以强制最旧的页面交换出来,以便拉入它需要访问的部分,并最终将所有堆重新洗到磁盘的一部分。在Linux上,如果幸运的话,你可以杀死这个进程,而在Windows上,你经常需要关闭这个盒子来重新启动控制。 – 2014-03-29 06:58:08

+0

所以这一切都是由于我认为GC执行得不好。 – LtWorf 2014-04-01 11:44:43