作为java项目OutOfMemoryError怎么处理,不是javaweb,不是tomcat溢出?

 ChinaSpecial 发布于 2022-10-31 06:19

不是web项目,纯java项目
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

4 个回答
  • 这种问题,建议用findbug或者sonar等工具跑一下程序看看哪里有内存泄露导致内存溢出的风险

    java.lang.OutOfMemoryError: Java heap space是堆内存的年轻年老态内存空间都用完时候就会抛,所以一般来说此问题主要是创建的内存无法回收,例如最常见的IO类用完后不做xx.close()

    光是在TOMCAT配置大内存是不够了,需要找到源头,如果有内存泄露问题存在,用再大的内存也是没用

    2022-10-31 22:45 回答
  • @letcheng 同意它的观点,你只是一个纯java项目,又不是web项目,你能创建多少对象,搞到堆发生OOM。所以,很大程度上还是你代码的原因。
    JDK下,有自带的JConsole.exe工具,你可以观察下你当前有多少对象,堆内存有多少,是在什么时候多到发生OOM的呢。

    2022-10-31 22:45 回答
  • 简单的解决方式就是调整堆的大小
    在Eclilpse中修改启动参数,在VM arguments 加入了-Xms384m -Xmx384m
    或者
    在tomcat的catalina.bat中加上-Xms384m -Xmx384m

    不过,建议最好再检查检查代码

    2022-10-31 22:45 回答
  • 不同意 @方正 的意见,也看到过很多人一发生 OOM 就开始改动堆内存的大小,而且调整堆内存也未必是越大越好。

    首先普及一下知识:

    • 堆内存分为新生代和老年代,新生代的用来存储经常要进行 GC 的对象,每个对象实例都会有个计数,都超过一定的时间仍未被 GC,就会晋升到老年代进行存储。

    • 老年代会比新生代的空间大一些。

    • 发生 OOM 都是老年代的内存不足(因为新生代的不足的情况下,会放到老年代进行存储)。

    建议按照如下的方式进行分析,解决问题:

    1.直接检查代码是否有问题,看看是否有死循环、集合未释放元素引用等内存泄露问题。

    2.设置 JVM 参数 -XX:+HeapDumpOutOfMemoryError-XX:HeapDumpPath=<你的path>

    3.采用内存映像分析工具(http://www.eclipse.org/mat/),分析到底是内存泄露还是内存溢出,内存泄露的情况下,找找泄露对象怎样和GC ROOTS 关联的,进而找到泄露代码的位置。

    4.如果不存在内存泄露,结合机器的物理内存,看看是否还可以继续调大堆内存 (-Xms 和-Xmx),这里也注意一下,并不是堆内存设置的越大越好,因为很大的内存发生 FULL GC 的时候,会发送很长时间的 "stop the world",这也不能接受的

    2022-10-31 22:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有