Java内存溢出举例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011517841/article/details/82863180

1 堆溢出

数组存放10亿个float

float arr[] = new float[1000000000];
for (int i = 0; i < 1000000000; i++) {
	Random random = new Random();
	float v = random.nextFloat() * 50f;
	arr[i] = v;
}

2. 栈溢出

栈溢出其实很好理解, 就是栈帧无线创建, 也就是无限调用方法

无线调用方法,无线栈帧

public class Test1 {

	public  Test2 test2 = new Test2();
	
}
public class Test2 {

	public  Test1 test1 = new Test1();
	
	public static void main(String[] args){
		
		Test2 test = new Test2();
		System.out.println(test);
	}
}

public class TestMethod {
	
	public void test1(){
		test1();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestMethod method = new TestMethod();
		method.test1();
		
	}

}

3. 方法区溢出

1.8以前用的是方法区,也叫永久带,使用的是JVM内存, 1.8以后使用元空间,直接占用的是本地内存

方法区用于存放Class相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。大量的类产生时,就会造成溢出异常

使用CGLib 动态产生类,造成方法区溢出

猜你喜欢

转载自blog.csdn.net/u011517841/article/details/82863180