Java heap space 内存堆栈溢出 解决方法

因为程序要从2个多G的文件中解码读取数据,读取近10W行记录处理,然后就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。
在网上一查可能是JAVA的堆栈设置太小的原因。
跟据网上的答案大致有这两种解决方法:
1、设置环境变量
set JAVA_OPTS= -Xms8192mm -Xmx10240m
可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。

2、java -Xms8192m -Xmx10240m className
就是在执行JAVA类文件时加上这个参数,其中className是需要执行的确类名。(包括包名)
这个解决问题了。而且执行的速度比没有设置的时候快很多。

如果在测试的时候可以在iead启动类 设置Edit Configurations-> VM options , 中输入 -Xms8192mm -Xmx10240m这个参数就可以了。


java.lang.OutOfMemoryError: Java heap space

=======================================================================

对于垃圾回收的原理不太了解,就在网上查了一下,发现了几篇不错的文章。

http://java.ccidnet.com/art/3539/20060314/476073_1.html
http://www.pconline.com.cn/pcedu/empolder/gj/java/0509/701281.html


还有:Java堆的管理—垃圾回收提到一下几点,很不错,或许可以作为写程序时候的准则:

  (1)不要试图去假定垃圾收集发生的时间,这一切都是未知的。比如,方法中的一个临时对象在方法调用完毕后就变成了无用对象,这个时候它的内存就可以被释放。

  (2)Java中提供了一些和垃圾收集打交道的类,而且提供了一种强行执行垃圾收集的方法--调用System.gc(),但这同样是个不确定的方法。Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。

  (3)挑选适合自己的垃圾收集器。一般来说,如果系统没有特殊和苛刻的性能要求,可以采用JVM的缺省选项。否则可以考虑使用有针对性的垃圾收集器,比如增量收集器就比较适合实时性要求较高的系统之中。系统具有较高的配置,有比较多的闲置资源,可以考虑使用并行标记/清除收集器。

  (4)关键的也是难把握的问题是内存泄漏。良好的编程习惯和严谨的编程态度永远是最重要的,不要让自己的一个小错误导致内存出现大漏洞。

  (5)尽早释放无用对象的引用。
大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null,暗示垃圾收集器来收集该对象,还必须注意该引用的对象是否被监听,如果有,则要去掉监听器,然后再赋空值。

就是说,对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。

扩展:

JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。在JVM启动时,JVM堆会自动设置heap size值。通常情况下,初始空间(即-Xms)默认值是物理内存的1/64,最大空间是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。这里对各个参数的意义解释一下:
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
Heap Size的设置不宜太小,也不宜太大。若设置太小程序的响应速度会变慢了,因为GC占用了更多的时间,而应用分配到的执行时间较少。太大也会造成空间的浪费,而且也会影响其他程序的正常运行。Heap Size 最大最好不要超过可用物理内存的80%。建议将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

================================================

过多的知识点就不在此多哔哔了,以下有几条链接,兄弟们可以参考:

JAVA HEAP SPACE解决方法和JVM参数设置_临风赏月的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中出现的异常“exception in thread 'maintthread' java.lang.outofmemoryerror: java heap space”是Java应用程序在运行过程中抛出的内存不足异常错误。它表示Java内存空间不足,无法满足程序运行的内存需求。 Java堆是Java虚拟机(JVM)运行时数据区域之一,用于存储对象实例和数组。当Java应用程序需要创建对象或数组时,都需要从堆中进行内存分配。然而,当堆内存不足时,就会出现内存溢出错误,即OutOfMemoryError。 这种错误通常发生在以下情况下: 1.应用程序运行时加载了大量数据,导致堆内存溢出。 2.应用程序在循环中创建了太多的对象,导致堆内存耗尽。 3.应用程序使用了递归调用,导致堆栈溢出,最终影响到堆内存。 要解决这个问题,可以采取以下方法: 1.增加Java内存的大小,通过调整JVM的启动参数-Xmx和-Xms来增加对堆内存的分配。例如,使用"-Xmx2g"参数将堆内存设置为2GB。 2.检查应用程序代码,确保没有造成内存泄漏的问题,例如未使用的对象没有及时释放,或者避免创建过多的无用对象。 3.优化算法和数据结构,减少内存使用。 4.如果应用程序需要处理大量数据,可以考虑分批进行处理,避免一次性加载全部数据。 总之,解决“exception in thread 'maintthread' java.lang.outofmemoryerror: java heap space”错误可以通过增加堆内存大小、优化代码和数据结构等方法解决

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值