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 |
最大直接内存容量,默认与堆的最大值一致 |