各种溢出
StackOverflowError:无结束的递归操作引起,发生在JVM虚拟机栈。
OutOfMemoryError:堆,JVM虚拟机栈都有可能发生,其中堆最常见.
内存模型图
图片来源网络
-
虚拟机栈:为虚拟机执行Java方法(也就是字节码)服务
-
本地方法栈:为虚拟机使用到的Native方法服务;内存不足时,本地方法栈会拋出native heap OutOfMemory
本地方法例子:System.currentTimeMillis() -
Java堆(Java Heap):存储实例对象
1、 设置堆的内存空间:-Xms256M 最小堆容量;-Xmx1024M 最大堆容量
2、新生代:1个Eden区+ 2个Survivor区;-XX:MaxTenuringThreshold 配置计数器的值到达某个阈值的时 候,对象从新生代晋升至老年代;
老年代:
3、XX:+HeapDumpOnOutOfMemoryError 让JVM遇到OOM异常时能输出堆内信息
4、垃圾回收主要发生地 -
方法区(Non-Heap):存放已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
1、对方法区的内存回收的主要目标是:对常量池的回收和对类型的卸载
2、允许固定大小,也允许可扩展的大小,还允许不实现垃圾回收
3、逻辑上属于堆
4、也会抛出OutOfMemoryError
5、编译时常量池,被加载后放入方法区的运行时常量池中;
int age = 21;//age是一个变量,可以被赋值;21就是一个字面值常量,不能被赋值;
int final pai = 3.14;//pai就是一个符号常量,一旦被赋值之后就不能被修改 -
Metaspace (元空间)(Java 1.8):类相关的元数据信息,其中字符串常量移至堆内存
1、在本地内存中分配
2、内存不足时,会抛出java.lang.OutOfMemoryError: PermGen space
3、1.8之前的版本需要配置-XX:MaxPermSize= l280m,之后版本不需要配置