版权声明:本文为博主原创文章,未经博主允许不得转载。 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 动态产生类,造成方法区溢出