Java堆溢出之OutOfMemoryError异常解决办法

在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下面都叫OOM)异常的肯能,下面就通过一些实例来验证异常发生的场景。 在下面举的例子中,在注释中会设定一些虚拟机的参数,在”VM Args”后边,如果你是用控制台命令来执行的程序,直接把这些参数放到Java命令之后就行,如果用的开发工具,Eclipse IDE,才Debug/Run页签中设置。


 

Java堆溢出

堆是用来存储对象实例的,当我们不断的创建对象,并且保证GC Roots和对象之间有相互的引用关系(GC Roots指垃圾回收器的对象,GC会手机那些不是GC Roots且没有被GC Roots引用的对象),当对象数量达到最大堆的容量的时候,就会产生内存溢出异常。

/**
 * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 * @author Administrator
 *
 */
public class HeapOOM
{

    static class OOMObject{
    }

    public static void main(String[] args){
        List<OOMObject> list=new ArrayList<OOMObject>();
        while(true){
            list.add(new OOMObject());
        }
    }
}
上述代码中限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms 参数与最大值-Xmx参数设置为一样就可以避免堆自动扩展),通过 -XX:+HeapDumpOnOutOfMemoryError 当虚拟机出现内存溢出的时候Dump出当前的内存堆转储快照以便后边进行分析。运行结果如下:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid5504.hprof ...
Heap dump file created [27872304 bytes in 0.150 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2245)
    at java.util.Arrays.copyOf(Arrays.java:2219)
    at java.util.ArrayList.grow(ArrayList.java:242)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)
    at java.util.ArrayList.add(ArrayList.java:440)
    at test.HeapOOM.main(HeapOOM.java:20)

刷新项目你就可以看到快照文件,可以用Eclipse Memory Analyzer来打开并进行分析。确定是Memory Leak,还是Memory Overflow。 处理思路:如果是内存泄漏,通过工具进一步查看泄漏对象到GC Roots的引用链,找到泄漏对象是如何和GC Roots相关联并导致垃圾回收器无法自动回收这些对象的。后边就可以判断产生内存溢出的代码的位置。 如果不存在内存泄漏问题,检查虚拟机的堆参数(-Xms -Xmx)跟物理机器对比是否还可以调大,在代码层面上看看是否存在某些对象生命周期过长、持有状态时间过长的情况。减少程序运行期间的内存消耗。

时间: 2024-10-15 02:46:33

Java堆溢出之OutOfMemoryError异常解决办法的相关文章

[Domino]“java.lang.ClassCastException:lotus.domino.cso.Item”异常解决办法

[Domino] "java.lang.ClassCastException:lotus.domino.cso.Item" 异常解决办法 编写者 日期 关键词 郑昀@ultrapower 2005-6 Java Domino RichTextItem   现象 通过Domino的Document.getFirstItem("Body")是可以获取当前邮件的Body字段,并试图直接转换为RichTextItem类型,从而访问该邮件的附件. 但是,有时候这个转换得到了下

Android ListView出现异常解决办法_Android

Android ListView 异常解决办法: ListView:The content of the adapter has changed but ListView did not receive a notification使用ListView时遇到如下的异常信息: 10-26 18:30:45.085: E/AndroidRuntime(7323): java.lang.IllegalStateException: The content of the adapter has chan

Android ListView出现异常解决办法

Android ListView 异常解决办法: ListView:The content of the adapter has changed but ListView did not receive a notification使用ListView时遇到如下的异常信息: 10-26 18:30:45.085: E/AndroidRuntime(7323): java.lang.IllegalStateException: The content of the adapter has chan

java defunct产生的原因和解决办法

解决 java defunct产生的原因和解决办法: 在很多时候,我们启动JAVA进程后,如果退出这个JAVA进程,在系统进程中仍然可以看到这个进程.这种情况一般出现在UNIX/LINUX系统,对于WIN平台出现情况较少. 这个进程在UNIX平台上,你即使kill进程号也不能杀掉它,但它仍然占用系统资源,成了真正的"僵尸". 产生的原因:以前我们下载JDK时,可以下载到JDK的SRC然后自己编译,现在的官方网站上已经找不到可以自己编译的JDK包,下载回来的JDK都是释放包,我们可以想象

redis 异常解决办法

redis 异常解决办法 26069:M 08 Aug 17:06:58.858 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 26069:M 08 Aug 17:06:58.859 # Server started, Redis version 3.0.7 26069:M 08

【JAVA秒会技术之异常解决】怎么解决eclipse报PermGen space异常的问题

在Eclipse使用JDK1.7及以下版本做开发时,用tomcat在启动时,经常会报这样一个错误: Caused by: java.lang.OutOfMemoryError: PermGen space. 解决办法1: 换成JDK1.8.因为JDK1.8已经将永久代移除堆内存. 解决办法2: 点击"Run"-"Run Configurations",在打开的窗口中点击"Arguments"选项卡. 在VM arguments中内容最下边输入:

Unrecognized Windows Sockets error: 0: JVM_Bind 异常解决办法

1.问题          通过Eclipse启动Tomcat时,抛出异常java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind.此异常的原因是服务器端口被占用          其解决办法包括以下两种:         一:更改服务器的端口号:         二:关闭占用当前占用该端口的进程 2.更改服务器端口号         到tomcat目录下的把conf文件夹下的server.xml文件中,找

[android]MonkeyRunner“java.net.SocketException: Broken pipe”错误解决办法

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice import time import random d=MonkeyRunner.waitForConnection() d.wake() for i in range(0,100): #TOUCH|{'x':55,'y':795,'type':'downAndUp',} d.startActivity(action='android.intent.action.MAIN

JSP上传图片产生 java.io.IOException: Stream closed异常解决方法_JSP编程

在做 jsp 上传图片时,把 java 代码直接改成 jsp,上传时产生 如下异常: 2012-12-31 8:59:21 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet jsp threw exception java.io.IOException: Stream closed ... 百思不得其解,翻出 jsp 转成 servlet 后的代码.如下(很很的醒目一下):