JVM-java内存区域与溢出
1,运行时数据区
线程共享:堆区,方法区
线程私有:虚拟机栈,程序计数器(PC),本地方法栈

程序计数器:代码地址,没有OOM
java虚拟机栈:
栈帧(局部变量表,操作数栈,动态链接,方法出口)
异常:StackOverflowError(线程请求的虚拟机栈深度>虚拟机允许的最大深度),OOM(虚拟机栈动态扩展无法申请到足够内存)
本地方法栈:
Hotspot中与虚拟机栈合二为一
异常:同虚拟机栈,StackOverflowError,OOM
堆区:对象实例
分代收集算法中的分区:新生代(Eden,From Survivor,To Survivor),老年代
内存分配角度:TLAB
-Xmx -Xms
OOM(没有内存,且无法扩展)
方法区:类信息,常量(常量表),静态变量,JIT编译的代码
非堆区
永久带
-XX:MaxPermSize
OOM(申请不到内存)
运行时常量池:编译期生成的字面量和符号引用,翻译出来的直接引用,OOM
2,非运行时数据区
直接内存:
堆外内存
DirectByteBuffer.allocate
OOM(申请不到内存)
3,对象内存
对象创建的内存分配:
指针碰撞:Serial,ParNew,带压缩过程GC收集器
空闲列表:CMS这类标记清除类GC收集器
多线程创建对象的同步处理:
CAS+失败重试
TLAB:+/-UseTLAB
对象的内存布局:
对象头
Mark Word:hashcode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳
类型指针:类元数据指针(哪个类的实例)
数组长度:紧数组对象拥有
实例数据
字段内容
填充对齐
占位符,对象起始地址8字节的整数倍
对象访问定位:通过栈上的reference类型来访问
句柄
直接指针:Hotspot的方式
浙公网安备 33010602011771号