一、内存与数据区域
JAVA所管理的内存是划分为不同的数据区域的,这些数据区域用途不同生命周期也不同。有的区域会在进程启动后一直存在,有的却会随着线程建立或销毁。
二、JVM有五个重要数据区域
名称 | 是否共享 | OutOfMemoryError | StackOverflowError | 功能 | 备注 |
---|---|---|---|---|---|
程序计数器 | X | X | X | 字节码行号指示器 | 若执行本地方法则计数值为空 |
JAVA虚拟机栈 | X | √ | √ | 用于存储局部变量表、操作数栈、动态链接、方法出口等信息 | 所谓java栈,一般是指java虚拟机栈或局部变量表 |
本地方法栈 | X | √ | √ | 服务于本地方法(native) | |
方法区 | √ | √ | X | 存放已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码缓存 | |
堆 | √ | √ | X | 存放实例化数据 | GC的主要回收对象 |
三、对象与空间
为新对象分配空间的两种方式:
method | alias | 适用场景 | GC算法 | GC方式 |
---|---|---|---|---|
Bump the pointer | 指针碰撞 | JAVA堆内存绝对规整 | Compact压缩整理 | Serial/ParNew |
Free list | 空闲列表 | JAVA堆内存犬牙交错 | Sweep | CMS |
对象访问定位的两种方式
访问方式 | JAVA堆 | 方法区 |
---|---|---|
句柄访问 | 句柄池:到对象实例数据的指针+到对象类型数据的指针 实例池:对象实例数据 | 对象类型数据 |
直接指针 | 到对象类型数据的指针+对象实例数据 | 对象类型数据 |
四、OutOfMemoryError异常定位
溢出区域 | 异常特点 | 可能原因 | 解决方案 |
---|---|---|---|
Java堆 | Java heap space | 内存泄露leak、内存溢出overflow | leak:查看泄露对象到GC Roots的引用链,从而定位无法回收的对象创建位置 overflow:扩大堆内存即可 |
虚拟机栈、本地方法栈 | unable to create native thread | 线程过多 | 减少线程数量或减少栈内存 |
方法区 | PermGen | jdk版本 | 升级版本至1.8,去永久代 |