1、运行时数据区组成
(1)堆区
(2)虚拟机栈区
(3)本地方法栈区
(4)方法区
(5)程序计数器
2、程序计数器的作用
(1)执行Java方法时:记录正在执行的虚拟机字节码指令的地址。
(2)执行Native(本地)方法时:计数器值为空(Undefined)
3、Java常量池
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。
(1)静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
(2)运行时常量池:运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。通俗的讲就是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
常量池包含的信息如图所示:
4、堆中分配对象空间的方式
(1)在Serial和ParNew等带Compact过程的收集器所管理的规则内存空间中采用指针碰撞的分配方式,因为剩余空间为规则的,所以做法为将指针向空闲空间挪动一段与该对象大小相等的空间。
(2)在CMS等这种采用Mark-Sweep算法的收集器管理的零散内存空间中使用空闲列表的分配方式。这是由于虚拟机中维护着一个空闲内存地址的列表。
避免因并发引起的空间分配问题:
(1)使用CAS保证更新操作的原子性。
(2)为每条分配内存的线程在堆中预先分配一小块内存空间(本地线程分配缓存TLAB),只有TLAB用完了并要分配新空间时才需要同步锁定。
5、对象的存储布局
6、堆中对象的访问方式
(1)直接指针访问方式。(HotSpot使用的方式)
优点:速度快。
缺点:对象移动时栈中的reference地址经常需要变动。
(2)使用句柄访问方式。
优点:对象移动时只需修改句柄指针。
缺点:指针定位开销大。