《深入理解Java虚拟机》笔记 - 持续更新

1、运行时数据区组成

(1)堆区

(2)虚拟机栈区

(3)本地方法栈区

(4)方法区

(5)程序计数器

2、程序计数器的作用

(1)执行Java方法时:记录正在执行的虚拟机字节码指令的地址。

(2)执行Native(本地)方法时:计数器值为空(Undefined)

3、Java常量池

Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。

(1)静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

(2)运行时常量池:运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。通俗的讲就是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。

常量池包含的信息如图所示:

image

4、堆中分配对象空间的方式

(1)在Serial和ParNew等带Compact过程的收集器所管理的规则内存空间中采用指针碰撞的分配方式,因为剩余空间为规则的,所以做法为将指针向空闲空间挪动一段与该对象大小相等的空间。

(2)在CMS等这种采用Mark-Sweep算法的收集器管理的零散内存空间中使用空闲列表的分配方式。这是由于虚拟机中维护着一个空闲内存地址的列表。

避免因并发引起的空间分配问题:

(1)使用CAS保证更新操作的原子性。

(2)为每条分配内存的线程在堆中预先分配一小块内存空间(本地线程分配缓存TLAB),只有TLAB用完了并要分配新空间时才需要同步锁定。

5、对象的存储布局

image

6、堆中对象的访问方式

(1)直接指针访问方式。(HotSpot使用的方式)

优点:速度快。

缺点:对象移动时栈中的reference地址经常需要变动。

(2)使用句柄访问方式。

优点:对象移动时只需修改句柄指针。

缺点:指针定位开销大。

你可能感兴趣的:(《深入理解Java虚拟机》笔记 - 持续更新)