`
wade6
  • 浏览: 274241 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于java中的OutOfMemory种类和解决方法

    博客分类:
  • jvm
 
阅读更多
 
1、OutOfMemory的四种情况
 
1) 永久区溢出    Exception in thread "main" java.lang.OutOfMemoryError: PermGen space  
           
         这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域(包括常量池: 静态变量),它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
         这种错误常见在web服务器对JSP进行pre compile的时候。
         可以通过设置jvm启动参数来解决: -XX:MaxPermSize=256m
 
/**
 * -XX:+HeapDumpOnOutOfMemoryError -XX:MaxPermSize=2m 
 */
public class PermGenSpace {
	
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		int i=0;
		while(true){
			list.add(String.valueOf(i++).intern());
		}
	}
}
  
 
2)堆溢出  java.lang.OutOfMemoryError: Java heap space
 
          这部分用于存放类的实例。被缓存的实例(Cache)对象,大的map,list引用大的对象等等,都会保存于此。
          堆内存会在jvm启动时自动设置,初始值 -Xms为物理内存的1/64,最大值-Xmx为1/4;可以通过参数-Xmn、-Xms、-Xmx设置,一般-Xms和-Xmx不超过80%,-Xmn为-Xmx的1/4;
 
/** 
 * -XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m  -XX:MaxNewSize=10m
 */
public class HeapSpace {
	
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		int i=0;
		while(true){
			list.add(new String(""+i++));
		}
	}
}
 
 
 
 
3)java.lang.OutOfMemoryError: GC overhead limit exceeded
      JDK6新增错误类型。当GC为释放很小空间占用大量时间时抛出。
 
 
/**
 * -XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m  -XX:MaxNewSize=256m
 */
public class HeapSpace {
	
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		int i=0;
		while(true){
			list.add(new String(""+i++));
		}
	}

}
 
可以添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit
 
4)栈溢出错误,非规范的OutOfMemoryError     Exception in thread "main" java.lang.StackOverflowError
 
          这部分用于存放局部变量、方法栈帧信息。栈帧太多,也就是函数调用层级过多时就会出现此异常,检查是否有死递归的情况。 
           对应的启动参数为:-Xss ( JDK1.5以后默认是1M,之前是256K)
 
/**
 * -XX:+HeapDumpOnOutOfMemoryError -Xss(默认1M)
 */
public class StackOverflow {
	
	public int i=0;
	
	public void stackLeak(){
		i++;
		stackLeak();
	}
	
	public static void main(String[] args) {
		StackOverflow sof = new StackOverflow();
		sof.stackLeak();
	}
}
 
 
 
           实例,以下是1G内存环境下java jvm 的参数设置参考: 
               JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true 
 
2、dump排查方案
        jvm启动时添加参数-XX:+HeapDumpOnOutOfMemoryError,这样当内存溢出时,会生成dump文件:
 
          java.lang.OutOfMemoryError: Java heap space 
          Dumping heap to java_pid5304.hprof ... 
          Heap dump file created [85357895 bytes in 2.095 secs]
 
       使用Memory Analyze分析,查看类使用情况;
 
3、分析工具
1)动态分析,实时 :  Jprofile
2)静态分析 ,需要dump文件:     Eclipse Memory Analyzer等
 
 
 
 
分享到:
评论

相关推荐

    java jvm初步了解;打卡狂神

    OOM(Out of Memory)是 Java 中的一种常见错误,发生在 JVM 无法分配对象时。StackOverFlowError 是一种特殊的 OOM 错误,发生在方法调用栈溢出时。要分析 OOM 和 StackOverFlowError 错误,需要使用 JVM 的一些...

    深入java虚拟机

    - 深入剖析JVM内存区域的划分及各区域的特点,同时讨论Out of Memory Error的产生原因及解决方法。 **4.2 JVM内存管理:深入垃圾收集器与内存分配策略** - 详细介绍不同版本JVM中支持的垃圾收集器种类及各自的工作...

    java内存泄漏与内存溢出关系解析

    java中有两个重要的概念:内存泄漏(Memory Leak)和内存溢出(Out of Memory)。内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,...

    简单了解JAVA内存泄漏和溢出区别及联系

    内存溢出(Out of Memory)是指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存...

    笔试面试宝典

    - 内存溢出:分析OOM(Out Of Memory)错误,掌握避免和解决策略。 3. **异常处理**: - 异常分类:检查性异常与运行时异常的区别,以及如何正确使用try-catch-finally结构。 - 自定义异常:何时和如何创建...

    内存管理器 (最新版)

    14. **内存故障处理**:当系统内存不足时,操作系统的OOM(Out Of Memory)杀手可能会终止某些进程,以释放内存供更重要的进程使用。 以上是内存管理的关键概念,但具体的“内存管理器(最新版)”可能包含更先进的...

    Android开发资料收集一

    11. **Android性能优化**:包括内存优化、UI流畅性优化、电量管理等,通过使用Profiler工具进行性能分析,以及理解ANR(Application Not Responding)和OOM(Out Of Memory)的避免方法。 12. **版本兼容性**:由于...

    died

    在Java编程中,这种情况通常是由于错误、异常未捕获,内存溢出(Out Of Memory),线程死锁,或者是系统资源耗尽等原因导致的。 【描述】"died"的描述过于简洁,但我们可以从中推测出一个程序或服务在执行时遇到了...

    新版Android开发教程.rar

    Compiler for Java, both of which are not supported for Android development----------------------------------- Android 编程基础 9 什么是 Android? Android? Android? Android? Android 是一个专门针对移动...

    百度校园招聘历年经典面试题汇总:Android岗

    - **OOM**(Out Of Memory)通常发生在程序分配内存过多或内存泄漏的情况下。 - **判断**:即使当前使用内存低于最大限制,如果分配大对象时无法找到足够的连续内存空间,也会发生OOM。 #### 18. Android中的跨进程...

    测试培训教材

    You can also view the system information that has been retrieved—such as CPU, memory, and processes running on the machine—and an image of the machine executing the system test. 6、测试用例设计、...

Global site tag (gtag.js) - Google Analytics