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

OutOfMemory的三种情况

 
阅读更多
摘自kakaluyi的<如何定位OutOfMemory的根本原因>,有部分修改

java的OutOfMemory有关Exception和可能出现的方式:

A Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
Java代码 复制代码 收藏代码
  1. public static void main(String[] args) {   
  2.     //使用List保持着常量池引用,压制Full GC回收常量池行为   
  3.     List<String> list = new ArrayList<String>();   
  4.     // 10M的PermSize在integer范围内足够产生OOM了   
  5.     int i = 0;   
  6.     while (true) {   
  7.         list.add(String.valueOf(i++).intern());   
  8.     }   
  9. }  
public static void main(String[] args) {
	//使用List保持着常量池引用,压制Full GC回收常量池行为
	List<String> list = new ArrayList<String>();
	// 10M的PermSize在integer范围内足够产生OOM了
	int i = 0;
	while (true) {
		list.add(String.valueOf(i++).intern());
	}
}

永久区溢出
这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域(包括常量池: 静态变量),它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

B java.lang.OutOfMemoryError: Java heap space
Java代码 复制代码 收藏代码
  1. public static void main(String[] args) {   
  2.     //使用List保持着常量池引用,压制Full GC回收常量池行为   
  3.     List<String> list = new ArrayList<String>();   
  4.     // 10M的PermSize在integer范围内足够产生OOM了   
  5.     int i = 0;   
  6.     while (true) {   
  7.         list.add(new String(i++));   
  8.     }   
  9. }  
public static void main(String[] args) {
	//使用List保持着常量池引用,压制Full GC回收常量池行为
	List<String> list = new ArrayList<String>();
	// 10M的PermSize在integer范围内足够产生OOM了
	int i = 0;
	while (true) {
		list.add(new String(i++));
	}
}

堆溢出
这部分用于存放类的实例。被缓存的实例(Cache)对象,大的map,list引用大的对象等等,都会保存于此。

C Exception in thread "main" java.lang.StackOverflowError
Java代码 复制代码 收藏代码
  1. public class JavaVMStackSOF {   
  2.     private int stackLength = 1;   
  3.     public void stackLeak() {   
  4.         stackLength++;   
  5.         stackLeak();   
  6.     }   
  7.     public static void main(String[] args) throws Throwable {   
  8.         JavaVMStackSOF oom = new JavaVMStackSOF();   
  9.         try {   
  10.             oom.stackLeak();   
  11.         } catch (Throwable e) {   
  12.             System.out.println("stack length:" + oom.stackLength);   
  13.             throw e;   
  14.         }   
  15.     }   
  16. }  
public class JavaVMStackSOF {
	private int stackLength = 1;
	public void stackLeak() {
		stackLength++;
		stackLeak();
	}
	public static void main(String[] args) throws Throwable {
		JavaVMStackSOF oom = new JavaVMStackSOF();
		try {
			oom.stackLeak();
		} catch (Throwable e) {
			System.out.println("stack length:" + oom.stackLength);
			throw e;
		}
	}
}

栈溢出
这部分用于存放局部变量、方法栈帧信息。栈帧太多,也就是函数调用层级过多时就会出现此异常,检查是否有死递归的情况。

今天碰到个内存溢出的问题,解决过程如下:
    • 首先启动时添加参数-XX:+HeapDumpOnOutOfMemoryError,这样当内存溢出时:
    •        java.lang.OutOfMemoryError: Java heap space

             Dumping heap to java_pid5304.hprof ...

           Heap dump file created [85357895 bytes in 2.095 secs]
  • 会在eclipse目录下生产内存文件;
  • 使用Memory Analyze分析,查看类使用情况,发现是由Map过大引起;
  • 查看代码中使用到Map的段,分析,解决问题;


问题over。
分享到:
评论

相关推荐

    解决Python运行文件出现out of memory框的问题

    在Python编程过程中,有时会遇到一个令人头疼的问题——"out of memory",即内存不足。这个问题通常发生在程序尝试分配超出系统可用内存的空间时。当Python解释器无法为新对象分配足够的内存时,它会抛出`Memory...

    android bitmap outOfMemory解决方法

    7. **监控内存使用**:利用Android的`ActivityManager`或第三方工具如MAT(Memory Analyzer Tool),可以分析应用的内存使用情况,找出内存泄漏和不必要的内存占用。 通过以上方法,开发者可以有效地管理和控制...

    解决Pytorch 训练与测试时爆显存(out of memory)的问题

    在使用PyTorch进行深度学习模型的训练和测试过程中,可能会遇到“显存溢出”(Out of Memory,OOM)的问题。这个问题通常是由于GPU内存不足以存储所有计算所需的张量而导致的。以下是一些解决PyTorch训练与测试时...

    Android完美解决GridView异步加载图片和加载大量图片时出现Out Of Memory问题

    然而,当处理大量图片时,特别是在用户滚动时实时加载,可能会遇到内存溢出(Out Of Memory,简称OOM)的问题。这是因为Android系统为每个应用程序分配的内存有限,而加载大图或大量图会消耗大量内存。因此,我们...

    Android避免内存溢出(Out of Memory)方法汇总

    在Android开发中,内存管理是至关重要的,尤其是避免内存溢出(Out of Memory,简称OOM),这可能导致应用程序崩溃。为了防止这种情况,开发者需要对程序进行优化,主要关注三个方面:内存引用、图像处理以及资源...

    IBM官方文档,websphere 内存泄漏分析步骤和工具使用

    1. **理解导致OutOfMemory条件的原因** 2. **使用Tivoli Performance Viewer检测内存溢出状况** 3. **获取详细的垃圾收集(GC)日志** 4. **获取Java堆内存快照(Heap Dump)** 5. **解读详细的垃圾收集日志** 6. **...

    Steelray Project Viewer 安装软件(打开.mpp文件)

    然而,不是每个人都拥有或熟悉Microsoft Project,这时就需要像Steelray Project Viewer这样的第三方软件来帮助我们查看和分析这些文件。本文将深入探讨Steelray Project Viewer的功能、安装过程以及如何利用它来...

    Android系统重启问题的归类

    OOM(Out Of Memory)导致的panic:当系统内存资源耗尽,内核无法找到可杀进程时,会触发“Kernel panic - not syncing: Out of memory and no killable processes...”。这类问题通常与内存管理有关,可能涉及某些...

    tomcat 出现 OutOfMemoryError 的解决方法

    因此,如果大量类被加载到 JVM 中而没有适当增加 PermGen space 的大小,就很容易出现内存溢出的情况。 #### 三、PermGen space 溢出的原因分析 1. **应用程序依赖大量 jar 包**:现代应用往往包含大量的第三方库和...

    编译时出现java.lang.OutOfMemoryError Java heap space异常

    2. **内存分配不合理**:某些情况下,由于配置不当导致JVM启动时分配的堆内存过小。 3. **内存泄漏**:程序中存在长时间未被释放的对象引用,导致垃圾回收机制无法正常工作,从而逐渐耗尽可用内存。 4. **并发线程...

    endurox-go:Go应用程序服务器(ASG)

    客户端和服务器服务通过中间件进行通信,该中间件支持三种用于请求/响应数据的缓冲区:任意字符串,字节数组,统一缓冲区格式(UBF),JSON缓冲区。 建立和测试状态 作业系统 状态 作业系统 状态 作业系统 状态 ...

    内存溢出及锁表问题的分析与解决.doc

    经分析,这是由于 DBCP 连接池 BUG 引起的,数据库连接不上后,没有将连接释放,最终使得 DBCP 报“OutOfMemory”错误。经过修改正确数据库连接参数后,就没有再出现内存溢出的错误。 第三步,安排有经验的编程人员...

    TimeoutEvent.rar_out

    当一个程序运行时,如果它请求的内存超过了系统可以分配的限制,就会触发"Out Of Memory"错误,这是一个常见的编程问题,特别是在处理大数据集或者复杂计算时。在这个场景中,我们关注的是Linux环境下针对此类错误的...

    快速解决jupyter启动卡死的问题

    当遇到Jupyter启动卡死的情况时,通常有以下几种可能的原因: 1. **配置文件问题**: Jupyter 的配置文件`jupyter_notebook_config.py`中的某些设置可能导致启动异常。 2. **资源占用过高**: 如果电脑内存或CPU资源...

    me_android_memory

    图片加载是内存消耗的大户,合理使用`BitmapFactory.Options`设置解码参数,避免加载过大图片导致OOM(Out Of Memory)错误。 9. **内存快照和比较**: 通过对比不同时间点的内存快照,可以找出内存占用增加的...

    设置Tomcat的初始启动内存

    因此,在本文中,我们将介绍如何设置Tomcat的初始启动内存,从而解决Out Of Memory的问题。 一、理解Java程序的内存分配 在Java程序中,JVM(Java Virtual Machine)会分配一个初始内存和最大内存给应用程序。初始...

    BIG-IP系统Linux主机部分内存问题故障排除方法

    2. **OutOfMemory (OOM) Error**: 当内存使用率达到极限时,系统可能会启动内存保护机制,自动终止某些进程以释放内存资源。例如,在日志中可能会出现类似`kernel: Out of memory: Kill process &lt;processID&gt; () ...

    Android--memory.rar_android_mobile android

    在Android系统中,内存管理是开发者必须关注的重要一环,因为不当的内存使用可能导致应用程序崩溃或者性能下降,其中最严重的后果就是出现“内存溢出”(Out Of Memory, OOM)。本文将深入探讨如何在Android平台上...

    “内存不足”的解决方法

    例如,如果在`CONFIG.SYS`文件中没有正确配置`EMM386.EXE`或者分配的扩展内存(Extended Memory)和高内存区(High Memory Area, HMA)不够充足,就容易导致内存不足的问题。 - 此外,如果在DOS下运行的程序占用的...

    内存溢出是什么意思?.docx

    第二步,检查错误日志,查看"OutOfMemory'错误前是否有其它异常或错误。通过检查错误日志,可以找到内存溢出前的错误或异常,并对其进行修复。 第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。需要...

Global site tag (gtag.js) - Google Analytics