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