2. Java内存区域与内存溢出异常
作者:
donglq | 来源:发表于
2017-10-03 22:03 被阅读0次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内存区域与内存溢出异常
本文链接:https://www.haomeiwen.com/subject/yszfyxtx.html
网友评论