JVM hotspot 内存 模型
2017-11-21 14:16:12 0 举报
AI智能生成
hotspot vm 内存模型
作者其他创作
大纲/内容
线程共享
方法区
存储多种信息
类信息
常量
静态变量
及时编译器编译后的代码
被描述为堆的逻辑部分
1.7以前是使用永久代来实现的方法区
容易遇到内存溢出问题
1.7中将字符串常量池移出了
当方法区无法满足内存分配需求时OOM
运行时常量池
用于存放class中的常量池数据
具备动态性
不要求常量一定是编译期产生
运行期间也可以放入新的常量
利用的最多的就是string.intern()
当无法申请到内存时OOM
堆
在虚拟机启动时创建
用来存放对象实例
使用分代回收算法
空间非连续
会抛出OOM
对象的内存布局
对象头
对象自生运行时数据
在32位和64位虚拟机中分别为32bit和64bit
官方叫他"Mark Word"
与对象自身定义的数据无关的额外存储成本
根据对象状态复用自己的存储空间
类型指针
只想他的类元数据
虚拟机通过这个指针来确定对象是哪个类的实例
如果对象是数组
还有一块用于记录数组长度的数据
实例数据
程序代码中定义的各种类型的字段内容
包括父类继承的还是子类中定义的
对齐填充
由于hotspot VM的自动内存管理系统要求对象的起始地址必须是8字节的整数倍
当示例数据部分没有对齐时,使用对齐填充补充
metaspace
1.8
不在虚拟机中分配,直接使用本地内存
大小只与配置和本地内存大小相关
线程隔离
程序计数器
记录线程所执行字节码的行号
java方法记录的是正在执行的虚拟机字节码指令地址
native方法的话计数器值为空
唯一一个没有OOM的区域
vm栈(虚拟机栈)
生命周期与线程相同
保存线程运行状态
描述的是Java方法执行的内存模型
最小单位是栈帧
局部变量表
存放可知的基本数据类型
对象引用地址
空间以32位为粒度
超过64位的数据占用2个变量空间
double
long
操作栈
动态链接
返回地址
非连续内存空间
会抛出异常
oom异常
stackoverflow异常
本地方法栈
为虚拟机提供Native方法服务
0 条评论
下一页