Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识。
在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap space(堆区域)、Java Stacks(Java栈)。其中永久保存区域主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGen space区域,Class需要存储的内容主要包括方法和静态属性。堆区域用来存放Class的实例(即对象),对象需要存储的内容主要是非静态属性。每次用new创建一个对象实例后,对象实例存储在堆区域中,这部分空间也被jvm的垃圾回收机制管理。而Java栈跟大多数编程语言包括汇编语言的栈功能相似,主要基本类型变量以及方法的输入输出参数。Java程序的每个线程中都有一个独立的堆栈。容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。

第一种OutOfMemoryError: PermGen space
发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generation space有关。解决这类问题有以下两种办法:
1. 增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行:
JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"
如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。使用上述方法,我成功解决了部署ssh项目的tomcat服务器经常宕机的问题。
2. 清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。

第二种OutOfMemoryError:  Java heap space
发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。解决这类问题有两种思路:
1. 检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。
我以前写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Java heap space的内存溢出问题,后来通过修改程序得到了解决。
2. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

第三种OutOfMemoryError:unable to create new native thread
这种错误在Java线程个数很多的情况下容易发生,我暂时还没遇到过,发生原意和解决办法可以参考:http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html

Java中OutOfMemoryError(内存溢出)的三种情况及解决办法相关推荐

  1. java 内存 溢出_java内存溢出的几种原因和解决办法是什么?

    java内存溢出的几种原因和解决办法是什么? java内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看 ...

  2. 【重复提交表单】表单重复提交的三种情况,解决办法

    引入 看一个重复提交表单的例子 F12可以看到,请求体中的参数在刷新页面之后仍然保留,因此每一次刷新页面,都会把现有的请求体中的表单数据提交一次到服务器,而接收的页面还是insert.jsp,于是造成 ...

  3. Java中OutOfMemoryError(内存溢出)的原理及解决办法

    Java中的OutOfMemoryError,即内存溢出,而无论是哪种内存溢出,都可以通过增加对应JVM内存空间解决:即修改对应内存参数的大小 根据内存区域的不同,存在多种情况,下面介绍最常见的几种情 ...

  4. Java中OutOfMemoryError(内存溢出)和Tomcat进程假死崩溃

    接手一个老项目ssh+jdk6+tomcat6,年底申报信息的系统开始频繁使用了,之前没有暴露的问题显现出来了 1.系统页面的响应时间变的很长. 2.偶尔会卡死,但等一会就好了,隔几天会突然挂掉. 3 ...

  5. Java中OutOfMemoryError(内存溢出)的情况及解决办法

    java.lang.OutOfMemoryError: Java heap space // TODO Auto-generated method stubVector v = new Vector( ...

  6. java内存(java内存溢出的几种原因和解决办法)

    java的内存模型有哪些呢? 在java中可采用如下的形式: synchronized关键字或使用java.util.concurrent.locks中的锁 volatile关键字 Volatile表 ...

  7. 内存溢出的几种原因和解决办法

    对于JVM的内存写过的文章已经有点多了,而且有点烂了,不过说那么多大多数在解决OOM的情况,于此,本文就只阐述这个内容,携带一些分析和理解和部分扩展内容,也就是JVM宕机中的一些问题,OK,下面说下O ...

  8. 内存溢出的几种原因和解决办法是什么?

    内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存. 引起内存溢出的原因有很多种,常见的有以下几种: 内存中加载的数据量过于庞大,如一次从 ...

  9. ​Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

最新文章

  1. java培训分享:java培训架构师学习线路图
  2. “地理智慧 链接未来”,2020 GIS 软件技术大会主题大会召开
  3. linux系统的sudo apt-get命令大全
  4. Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
  5. 中兴中心管理服务器fxh3120,中兴多媒体业务中心ZXMS80
  6. 数据库MySQL/mariadb知识点——数据类型
  7. TraceView(profile) and Systrace
  8. Database2Sharp之混合型Winform框架代码生成
  9. signature=27524ebaa2473e38aa641bf251dcf3cf,[Without Title]
  10. Python字符串isidentifier()
  11. LaTex中编译时出现“ Undefined control sequence”问题
  12. java.util.ConcurrentModificationException的解决办法
  13. webRTC:jssip登录freeswitch的正确办法及代码
  14. 给出问题的答案 你就可以成为百万富翁
  15. 基于Token的身份验证的原理
  16. SAP PS 第2节 项目状态及字段选择
  17. 避免卷入办公室政治-开发就是这么坑!
  18. centos 禁止自动锁屏
  19. 豆芽的生长过程观察日记-绿豆发芽观察日记7天-2021年
  20. python EOFError: marshal data too short问题处理

热门文章

  1. U盘安装Fedora 24时出现的几个问题及解决办法
  2. java.lang.NoClassDefFoundError: org/jdom2/JDOMException
  3. macbook android 热点,Mac_mac如何做热点?mac创建wifi热点方法介绍,  如果是家里有路由器的, - phpStudy...
  4. 示波器1m和50欧姆示阻抗匹配_示波器的阻抗选择
  5. GET /static/js/jquery-3.5.1.min.js HTTP/1.1 200 89476
  6. RollPitchYaw傻傻分不清
  7. 应用程序安装在sd卡还是内存选择及设置
  8. java中x--与--x_GitHub - xsonorg/xco: XSON Common Object
  9. 基于域对抗图卷积网络的多变环境下故障诊断
  10. linux iso镜像怎么用u盘装,如何使用U盘安装ISO系统镜像?