`

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

 
阅读更多

第一种OutOfMemoryError: PermGen space (永久保存区域)

Permanent Generation space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了

 

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有关。

 

比如下面代码就会产生此种情况的内存溢出。

 

Set<Object> set = new HashSet<Object>();

 

for (int i = 0; i < 100000000; i++) {

 

set.add(new Object());

 

}

 

 

 

解决这类问题有两种思路:

 

1. 检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。

 

我以前写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Java heap space的内存溢出问题,后来通过修改程序得到了解决。

 

2. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

 

 

 

 

 

第三种OutOfMemoryError:unable to create new native thread

 

 

 

上面这种种溢出错误,已经说明了线程的内存空间,其实线程基本只占用heap以外的内存区域,也就是这个错误说明除了heap以外的区域,无法为线程分配一块内存区域了,这个要么是内存本身就不够,要么heap的空间设置得太大了,导致了剩余的内存已经不多了,而由于线程本身要占用内存,所以就不够用了。

 

 

 

 RUNTIME 类的使用:
 
Java 给我们提供了Runtime 类得到JVM 内存的信息
 方法名称  参数 作用  返回值 
 getRuntime   无  获取Runtime 对象   Runtime 对象 
 totalMemory   无  获取JVM 分配给程序的内存数量   long:内存数量 
 freeMemory  无  获取当前可用的内存数量   long:内存数量 
 maxMemory   无  获取JVM 可以申请到的最大内存数量  long:内存数量 

分享到:
评论

相关推荐

    解决OutOfMemoryError内存溢出

    ### 解决OutOfMemoryError内存溢出 在Java开发过程中,我们经常会遇到`java.lang.OutOfMemoryError`(简称OOM)的问题。这个问题的发生主要是由于JVM内存不足或程序中存在内存泄漏所引起的。本文将深入探讨OOM产生...

    JAVA内存溢出

    JAVA中OutOfMemoryError(内存溢出)的三种情况及解决办法 Java中的OutOfMemoryError(内存溢出)是一种常见的错误,本文将详细介绍OutOfMemoryError的三种情况及其解决方法。 首先,我们需要了解JVM(Java虚拟机...

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行...内存溢出问题是 Java 开发中常见的错误,通过调整容器参数和优化程序代码,可以避免内存溢出的发生。

    内存溢出解决

    通过上述方法,开发者可以有效解决Java中的内存溢出问题。当然,在实际应用中还需要结合具体情况灵活运用这些技巧。此外,定期对代码进行审查和重构也是预防内存溢出的有效手段之一。希望本文能帮助到正在面对内存...

    java.lang.OutOfMemoryError: Java heap space 解决方法

    "Java.lang.OutOfMemoryError: Java heap space 解决...Java.lang.OutOfMemoryError: Java heap space 是一种常见的 Java 错误,解决该问题需要从多方面入手,包括调整 JVM 的堆大小、调整 Tomcat 的配置、优化程序等。

    java.lang.OutOfMemoryError解决办法

    Java中的`java.lang.OutOfMemoryError`是一种常见的运行时错误,通常表示应用程序在尝试分配内存时遇到了问题。根据提供的信息,这个错误主要涉及到两个方面:`PermGen space`和`Java heap`,并且与Tomcat服务器相关...

    myeclipse内存溢出问题解决方案

    内存溢出问题在Java开发中是一个常见的问题,尤其是在使用集成开发环境如MyEclipse时,由于资源消耗较大,可能会频繁出现。本文主要讨论如何解决MyEclipse中的内存溢出问题以及相关的Java内存管理知识点。 首先,...

    java内存溢出原因

    本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space溢出以及Native Heap溢出,并提供相应的解决方案。 1. **JVM PermGen space溢出** - ** PermGen space** 是JVM内存模型中的...

    关于java堆内存溢出的几种情况

    本文将详细介绍几种常见的Java堆内存溢出情况及其解决方案。 【情况一】:`java.lang.OutOfMemoryError: Java heap space` 这是由于Java堆内存不足造成的。可能的原因有两个:一是实际分配的堆内存确实不够程序运行...

    MAT解析hprof内存溢出分析工具OutOfMemoryError-java程序开发

    Java开发过程中,遇到`OutOfMemoryError`是一种常见的挑战,它表明程序在运行时耗尽了内存资源。MAT(Memory Analyzer Tool)是IBM提供的一款强大的Java内存分析工具,它专为解决此类问题而设计,帮助开发者深入理解...

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    其中,“java.lang.OutOfMemoryError: Java heap space”是一种常见的异常情况,它表明Java虚拟机(JVM)的堆内存空间已耗尽。 #### 标题和描述中的知识点详解 **标题:“java错误处理:java.lang.OutOfMemoryError:...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    在Java应用服务器中,Tomcat是一个非常常见的轻量级选择,尤其在开发和部署Web应用程序时。然而,如同任何其他程序一样,Tomcat也可能遇到内存管理问题,导致内存溢出。"java.util.concurrent.ExecutionException: ...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...

    eclipse 内存溢出解决办法

    ### Eclipse 内存溢出解决办法详解 #### 一、PermGen Space 概念与问题成因 在Java虚拟机(JVM)中,PermGen Space(Permanent Generation Space)是专门用于存储Class和Meta信息的一个区域。当一个Class被加载到...

    完美解决java读取大文件内存溢出的问题

    以上两种解决方案都可以完美解决java读取大文件内存溢出的问题。它们可以让我们遍历大文件,而不需要将整个文件读取到内存中,从而避免内存溢出。 在实际应用中,我们可以根据具体情况选择合适的解决方案。比如,...

    关于JVM内存溢出的原因分析及解决方案探讨.docx

    本文主要讨论了 JVM 中的内存溢出问题,包括内存溢出的定义、内存泄漏和内存溢出的区别与联系、JVM 垃圾回收机制、内存溢出的原因分析、常见的四种内存溢出情况以及解决方案。 一、内存溢出的定义 内存溢出是指...

    java虚拟机内存溢出常见问题解析

    Java虚拟机内存溢出(Java Virtual Machine Memory Overflow)是一个常见的问题,特别是在运行大型的企业级Java应用时。内存溢出,通常表现为`OutOfMemoryError`,是由于程序在运行过程中耗尽了JVM分配的内存资源,...

Global site tag (gtag.js) - Google Analytics