JVM 运行时数据区

 

原文地址: http://coderbee.net/index.php/java/20131017/512

 

《深入理解Java虚拟机:JVM高级特性与最佳实践》-笔记

 

JVM运行时数据区

根据《Java虚拟机规范》,JVM管理的内存如下:
jvm_runtime_data_area
图片来自网络。

其中绿色部分是所有JVM线程共享的,黄色部分是线程独立的。

 

 

程序计数器

记录正在执行的虚拟机字节码指令的地址,如果执行的本地方法,则值为未定义。

 

方法区

存储已加载类信息、常量、静态变量、即时编译器编译后的代码等数据。

 

HotSpot虚拟机把方法区称为永久代。

 

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。相对于Class文件常量池的一个特征是具备动态性,可在运行时把常量放入池中,如通过String.intern方法。

 

虚拟机栈

描述Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法的调用和完成都对应一个栈帧在栈上的入栈和出栈。

 

局部变量表存放编译期可知的基本数据类型、对象引用、returnAddress类型。所需内存空间在编译期完成分配,在运行期不变。

 

当虚拟机无法创建栈帧时抛出StackOverflowError错误。

 

本地方法栈

与虚拟机栈帧作用类似,为本地方法服务。

 

Java堆

存放对象实例及数组。垃圾回收发生的主要地方。

 

对象的内存布局

在虚拟机实现里,一个对象的内存布局包括:对象头、实例数据、对齐填充。

 

HotSpot虚拟机的对象头包括两部分信息:

  • 存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据称为“Mark Word”。是非固定格式的。

  • 类型指针,指向对象所属类型的元数据,虚拟机通过这个指针来确定这个对象是哪个类的实例。

对象的访问定位

一般有两种方式:

  • 句柄:每个句柄包含了对象实例数据与类型数据各自具体地址信息。访问对象数据需要2次定位,在垃圾回收移动对象后,只需要修改句柄的值,不需要修改栈上对象引用的值。

  • 直接指针:直接指向对象实例数据的地址,对象实例数据含有指向对象类型数据的地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值