java 常见内存溢出

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

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

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

【JAVA学习】java虚拟机内存配置,-Xss256m -Xms512m -Xmx800m -XX:MaxPermSize=512m

一.Java虚拟机内存配置: (1)操作:项目名(如:CK02)->右键(选择选项Properties)->Run/Debug Settings->选中要执行的程序(如:Launch)->点击(...
  • a503921892
  • a503921892
  • 2014年09月04日 10:13
  • 4582

ByteArrayInputStream之内存溢出(IoUtils)

今天一同事做了批量导入数据的功能,但是服务器老是死机。查看服务器内存8G的内存占了7G多,很明显是内存泄漏。后来发现对文件的操作的时候用到了ByteArrayInputStream,仔细查看代码看到了...
  • youyedemeng
  • youyedemeng
  • 2014年03月21日 19:31
  • 6253

解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理大文件

1、传统的在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: 1 2 ...
  • Mr_Smile2014
  • Mr_Smile2014
  • 2015年11月19日 15:50
  • 9875

ByteArrayOutputStream或ByteArrayInputStream不需要关闭流原因分析

在解压图片的时候发现ByteArrayOutputStream不需要关闭,为啥呢? ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的...
  • u012668925
  • u012668925
  • 2016年12月30日 12:35
  • 2799

Java 虚拟机初始堆大小和最大堆大小不能盲目设置

以前碰到不少做J2EE应用的同事。 他们在碰到WAS跑起来很慢的时候,就会考虑到WAS的内存不够用。从而在增加内存后,盲目设置WAS的Java虚拟机初始堆大小和最大堆大小。 以前我见过的一个烟草的项...
  • teresa502
  • teresa502
  • 2014年03月12日 10:58
  • 6017

配置tomcat服务器内存大小中的Xms、Xmx、PermSize、MaxPermSize 详解

1.参数的含义 -vmargs -Xms256m -Xmx512m -XX:PermSize=256M -XX:MaxPermSize=512M -vmargs 说明后面是VM的参数,所以后面的其...
  • starwind_
  • starwind_
  • 2016年10月26日 20:41
  • 15894

MyEclipse内存不足以及参数配置“ -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M ”

使用myeclipse8.5出现如下问题: MyEclipse has detected that less than 5% of the 31MB of Eden Space (Heap memo...
  • azhegps
  • azhegps
  • 2016年06月09日 15:37
  • 2469

Java内存溢出详解及解决方案

内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题。内存溢出与锁表则不然,一...
  • xianmiao2009
  • xianmiao2009
  • 2015年10月19日 20:15
  • 12206

Java基础恶补——内存泄露、内存溢出

Java基础恶补——内存泄露、内存溢出 (2010-09-15 15:56:26) 转载 标签: 杂谈   要点 内存泄露是指程序中间动态...
  • wisgood
  • wisgood
  • 2013年11月19日 09:29
  • 28267

Java常见的几种内存溢出及解决方法

Java常见的几种内存溢出及解决方法【情况一】: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),...
  • huxing998
  • huxing998
  • 2016年11月22日 11:20
  • 746
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 常见内存溢出
举报原因:
原因补充:

(最多只允许输入30个字)