Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

版权声明:https://blog.csdn.net/qq_40224714?t=1 https://blog.csdn.net/qq_40224714/article/details/89195166

参考文章:https://blog.csdn.net/lihaitao000/article/details/51159562

一、解决方案

(1)设置jvm heap大小
(2)现象:在eclipse的配置文件eclipse.ini中设置-vmargs -Xms500m -Xmx1024m,在eclipse中直接run 或者debug某些耗内存的程序时依然出现java.lang.OutOfMemoryError: Java Heap Space错误,即通常认为的内存不足,java虚拟机内存不够用。

配置文件所在位置,为安装位置

在这里插入图片描述

eclipse.ini

在这里插入图片描述

选中被运行的类,点击菜单‘run->run configuration …’,选择(x)=Argument标签页下的vm arguments框里

输入 -Xmx800m, 保存运行
在这里插入图片描述

二、有三种可能导致OutOfMemoryError。

1、第一种:

JVM有真实的内存泄漏,导致此JVM堆在内部实现时产生了一个Bug。这极不可能发生,所有JVM都经过充分的测试,如果有人发现这种bug,绝对是最高优先级的Bug。

2、第二种

可能的OutOfMemoryError原因,没有为应用程序运行时给足够多的可用内存。这种情况,有两种可能的方案:

(1) 增加 JVM堆可用大小

提高JVM可用堆大小可以简单的使用JVM的 -Xmx 参数。

  • 启动虚拟机的时候,加上一个参数:-Xms800m -Xmx800m
 -Xms <size>         // 设置JVM初始化堆内存大小 
 -Xmx <size>         // 设置JVM最大的堆内存大小 
  • 如果是应用程序,则:java -Xms800m -Xmx800m你的类名
  • 如果是tomcat之类的web服务器,在这个服务器的启动文件后面加上这个参数即可。
  • 另外设置环境变量
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

读者 Jams Stauffer 指出有些JVM(例如 sun的 JVMs),

“Perm”参数用来处理JVM结构与类对象。如果你正在使用一个数量非常巨大的类集,它有可能运行在"Perm"空间

那么你需要增加此空间的大小,例如,sun的JVM使用 -XX:PermSize 与 -XX:MaxPermSize选项。

(2) 减少你的应用程序所需的内存总量

假如你将此参数设置尽可能的大(可用内存极限不要超过系统物理内存,否则你的应用程序将分页并暂停),仍然有以上所提到的内存问题,那么,你需要使用更小的集合/缓冲区/表空间/对象.....,以减少你的应用程序所可能用到内存总量。可能是你只是让一些集合过大了,例如使用了许多大的缓冲区;要求你重新实现一些类,重新设计应用程序。

3、第三种

导致OutOfMemoryError最为常见,无意的对象引用保持。你没有明确无误的释放对象,以致于你的堆一再增长,直到你没有额外的空间。

解决方案:
  • 找到保持这些无意引用的源对象,改变它并释放这些对象。

在IBM开发者社区的文章纲要式的揭示了这样一个通用的处理过程。这个过程主要是等到应用程序到达恒定状态--你将期望最多新创建的对象是临时对象,并且可以被垃圾收集器收集——这常常是在应用程序所有的初始化工作完成之后。

  1. 强迫垃圾收集,获得一个堆的对象快照。
  2. 做任何工作可能正在导到无意的对象引用保持。
  3. 强迫另一次垃圾收集并获得第二次堆的对象快照。

比较这两个快照,观察从第一个快照到第二个快照哪些对象在数量上有所增加。因为你在快照之前强迫垃圾收集,剩下的将是所有被应用程序引用的对象,比较两个快照将准确的标识那些新创建的、保留在应用程序里的对象。
根据你对应用程序的认识,决定两个快照比较中,哪些对象正在无意的保持对象引用。
跟踪前导引用,找到哪些对象正在引用这些无意的保持对象,直到你找到导致此问题的源对象

猜你喜欢

转载自blog.csdn.net/qq_40224714/article/details/89195166