2. Java内存区域与内存溢出异常

2.2 运行时数据区域

区域 线程私有\线程共享 是否存在内存溢出 功能
共享 存放对象实例数据
方法区 共享 存放对象类型信息
虚拟机栈 私有 存放本地变量
本地方法栈 私有 类似虚拟机栈,存放本地方法的本地变量
程序计数器 私有 记录线程执行的位置

2.3 对象访问

方式 实现方式描述 优点 缺点
使用句柄 Java堆中划分出一块作为句柄池,reference中存放的是对象的句柄地址,句柄地址包含了对象实例数据和类型数据各自的地址 reference中存储的是稳定的句柄地址,在对象移动时只会改变句柄中的对象实例地址,reference本身不需要被修改
直接指针 reference中直接存放的是是对象实例的地址,其中包含实例数据和类型地址 速度更快,节省了一次指针定位的开销

2.4 内存溢出

1. 堆溢出
参数
参数 功能
-Xms 堆最小容量
-Xmx 堆最大容量
-XX:+HeapDumpOnOutOfMemoryError 内存溢出时存储堆转储文件
-XX:+PrintGCDetails 打印GC详情
2. 栈异常
异常类型
名称 异常原因
StackOverFlowError 线程请求的栈深度大于虚拟机允许的最大栈深度
OutOfMemoryError 虚拟机在扩展栈时无法申请到足够的内存空间
参数
参数 功能
-Xoss 设置本地方法栈大小(HotSpot不区分虚拟机栈和本地方法栈,因此此参数不起作用)
-Xss 设置栈大小
3. 运行时常量池溢出

常量池分配在方法区中

参数
参数 功能
-XX:PermSize 方法区容量
-XX:MaxPermSize 方法区最大容量
4. 方法区溢出
方法区功能

用于存放Class相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。

5. 直接内存溢出
参数 功能
-XX:MaxDirectMemorySize 最大直接内存容量,默认与堆的最大值一致

你可能感兴趣的:(2. Java内存区域与内存溢出异常)