Android知识Android开发Android技术知识

JVM(1)-运行时数据区

2018-05-08  本文已影响0人  Jdqm
2018-05-08

一直没有系统的学习JVM相关的知识,之前偶尔查看某些章节,比如类的加载过程、GC策略、内存模型等,趁这段时间全面系统学习一番,记录下关键的知识点方便后面翻阅。

I.运行时五大数据区

  1. 方法区(Method Area)
  2. 虚拟机栈(Java Virtual Machine Stack)
  3. 本地方法区(Native Method Area)
  4. 堆(Heap)
  5. 程序计数器(Program counter Register)
JVM运行时数据区

II.对象的创建(HotSpot)

通过new关键字创建(或克隆、反序列化)

  1. 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用所代表的类是否被加载、解析和初始化过,如果没有则必须先完成类的加载过程;
  2. 分配内存,类加载完成后,对象的大小已经确定;分配过程需要考虑同步问题,采用CAS加失败重试;或者采用本地线程分配缓存(TLAB),这种方式只有在TLAB用完的时候才需要同步;
  3. 内存分配完成后,就进行零值初始化(不包含对象头),如果是采用TLAB那这个过程也可以提前至TLAB的过程;
  4. 执行<init>来进行初始化;

III.对象内存布局

对象头(Header)
实例数据(Instance Data)
对齐填充(Padding)非必须

其中对齐填充不是非必须的,主要是HotSpot VM的自动内存管理系统要求对象的起始地址必须是8字节的整数倍。

IV.对象的访问

方式一:采用对象句柄,通过 Java虚拟机栈本地变量表->对象句柄(在堆中划分一个句柄池)->实例数据或者对象类型数据;这种方式在实例对象地址改变时(比如GC后整理内存空间),栈中引用的句柄的地址不需要改变;


通过句柄访问

方式二:直接引用,栈中的引用存储的是对象的地址,这种情况就需要堆中的对象布局必须考虑如何放置对象类型的相关信息,这种方式就少了一次寻址,速度更快。Sun HotSpot虚拟机就是采用这种方式。


直接引用访问

下一篇:垃圾收集器与内存分配策略

上一篇 下一篇

猜你喜欢

热点阅读