java常见内存溢出情形

虚拟机栈溢出(如果虚拟机在扩展时无法申请到足够的内存空间将抛出OutOfMemoryError)

package com.jvm.memory;

import java.util.ArrayList;
import java.util.List;

public class HeapOOM {

	/**
	 * VM 运行时参数 -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
	 * @param args
	 */
	public static void main(String[] args) {
		List<OOMObject> list = new ArrayList<OOMObject>();
		while(true){
			list.add(new OOMObject());
		}
	}

	static class OOMObject{

	}
}

java.lang.OutOfMemoryError: Java heap space

Dumping heap to java_pid2076.hprof ...

Exception in thread "main" Heap dump file created [24777740 bytes in 1.181 secs]

java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:2760)

at java.util.Arrays.copyOf(Arrays.java:2734)

at java.util.ArrayList.ensureCapacity(ArrayList.java:167)

at java.util.ArrayList.add(ArrayList.java:351)

at com.jvm.memory.HeapOOM.main(HeapOOM.java:14)

java堆用于存储对象实例,我们只要不断的创建对象,达到最大容量限制后,最后就会导致堆内存溢出,

我们如果在系统中出现这种情况就要利用映像分析工具以及对dump转储出来的快照进行分析,看创建这些类是否是有

必须要的。从2个方面检查1:看看对参数是不是设置有问题,是否还可以调大。2:检查是不是某些对象的生命周期过长。

本地方法栈溢出(如果线程请求的栈深度大于虚拟机本身所允许的最大深度,将抛出StackOverflowError)

package com.jvm.memory;

public class JavaJVMStackOOM {
	/**
	 * VM args -Xss128k
	 * @param args
	 */
	public static void main(String[] args) {
		JavaJVMStackOOM oom = new JavaJVMStackOOM();
		oom.stackLeak();
	}

	private int stackLenth=1;

	public void stackLeak(){
		stackLenth++;
		stackLeak();
	}
}

Exception in thread "main" java.lang.StackOverflowError

at com.jvm.memory.JavaJVMStackOOM.stackLeak(JavaJVMStackOOM.java:16)

at com.jvm.memory.JavaJVMStackOOM.stackLeak(JavaJVMStackOOM.java:17)

常量池溢出

package com.jvm.memory;

import java.util.ArrayList;
import java.util.List;

public class RuntimeConstantPoolOOM {
	/**
	 * VM Args -XX:PermSize=10 -XX:MaxPermSize=10
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		int i=0;
		while(true){
			list.add(String.valueOf(i++).intern());
		}
	}
}

Error occurred during initialization of VM

Too small initial permanent heap

时间: 2024-10-28 17:44:36

java常见内存溢出情形的相关文章

java常见内存溢出(OOM)

jvm内存区域 程序计数器一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. java栈与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存放基本数据类型,对象引用(一个指向对象起始地址的引用指针或一个代表对象的句柄),reeturnAddress类型(指向一条字节码指令的地址) 栈区域有两种异常类型:如果线程请求的栈深度大于虚拟机所允许的深度,将抛StrackOverflowError异常:如果虚拟机栈可以动态扩展(大部分虚拟机都可动态扩展),当扩展

Java常见内存溢出异常分析(OutOfMemoryError)

链接地址:http://my.oschina.net/sunchp/blog/369412 1.背景知识 1).JVM体系结构 2).JVM运行时数据区 JVM内存结构的相关可以参考: http://my.oschina.net/sunchp/blog/369707 2.堆溢出(OutOfMemoryError:java heap space) 堆(Heap)是Java存放对象实例的地方. 堆溢出可以分为以下两种情况,这两种情况都会抛出OutOfMemoryError:java heap spa

Java虚拟机结构及常见内存溢出异常

每个Java虚拟机都有一个类加载器子系统,根据某个全限定名来装入类型,同样每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令. 当虚拟机运行一个程序时,就需要从已加载的文件中得到信息,将这些信息组织到运行时数据区,以便于管理. Java运行时的数据区域划分 1.程序计数器:程序计数器是一块较小的内存空间,可以看做是当前线程的字节码的行号指示器. Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个时刻,一个处理器只会执行一条线程中的指

Java 出现内存溢出的定位以及解决方案

在上一节中Java虚拟机内存分布   说了Java虚拟机中分为五个区域,而且也知道了在Java程序计数器区域不会出现OOM(OutOfMemeryError),那么以下就对除了程序计数器以外的四个区域出现OOM的原理以及解决方案进行解说. 1.Java虚拟机栈与本地方法栈 栈的大小控制參数时 -Xss. Java虚拟机在栈中定义了两种异常,StrackOverFlowError和OutOfMemeryError.当请求栈的深度大于java虚拟机所同意的最大深度则抛出StrackOverFlowE

java虚拟机内存溢出各种场景总结

java堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且保证gc roots到对象之间有可达路径来避免垃圾回收机制来清楚这些对象,那么在 对象到达最大堆的容量限制后就会产生内存溢出溢出. 异常:java.lang.OutOfMemoryError: java heap space 要解决这个区域的异常,首先要区分是出现了内存泄露(Memory Leak)还是内存溢出(Memory OverFlow). 解决方式:如果是内存泄露,通过工具(eclipse memory analyzer

Java虚拟机-内存溢出异常

内存泄露与内存溢出 内存泄露一般是代码设计存在缺陷导致的,指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存.即被分配的对象可达但是已经无用:通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码水平: 内存泄露的几种场景:1.长生命周期的对象持有短生命周期对象的引用      例如:在全局静态map中缓存局部变量,且没有清空操作,随着时间的推移,这个map会越来越大,造成内存泄露:2.修改hashset中对象的参数值,且参数是计算哈希值的字段     当一个

Java 出现内存溢出的定位以及解决方式

在上一节中Java虚拟机内存分布   说了Java虚拟机中分为五个区域,并且也知道了在Java程序计数器区域不会出现OOM(OutOfMemeryError),那么下面就对除了程序计数器以外的四个区域出现OOM的原理以及解决方式进行讲解. 1.Java虚拟机栈与本地方法栈 栈的大小控制参数时 -Xss. Java虚拟机在栈中定义了两种异常,StrackOverFlowError和OutOfMemeryError.当请求栈的深度大于java虚拟机所允许的最大深度则抛出StrackOverFlowE

【转】Java学习---内存溢出的排查经历

[原文]https://www.toutiao.com/i6595365358301872643/ 前言 OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界.空指针等)来说这类问题是很难定位和解决的. 本文以最近碰到的一次线上内存溢出的定位.解决问题的方式展开:希望能对碰到类似问题的同学带来思路和帮助. 主要从表现-->排查-->定位-->解决 四个步骤来分析和解决问题. 表象 最近我们生产上的一个应用不断的爆出内存溢出,并且随着业务量的增长出现的

记一次java程序内存溢出问题

一个自然语言处理程序,在封装为web-service后,部署到线上运行. 但最近出现了内存溢出的情况,频繁的out of memory. 先盲目尝试在启动脚本中增加-XX:-UseGCOverheadLimit. 因为根据原因未找到,依然频繁的out of memory,只能一直观察jstat -gcutil <pid>,看到老生代内存降不下来时,重启程序. 服务程序很简单,简单接收参数,自然语言处理,返回数据,除了自然语言处理模块,都是方法参数,不会出现内存泄漏的情况. 第一次解决这种内存溢