深入理解JAVA虚拟机----------JAVA内存区域划分

1程序计数器
程序计数器的作用是保存当前线程的执行指令
2虚拟机栈
每一个线程,都有其独立的虚拟机栈,每个方法被执行时,都会创建一个栈幁,栈幁中存储着方法的出口,局部变量表等
深入理解JAVA虚拟机----------JAVA内存区域划分
3本地方法区
执行本地方法

4堆区
Java中的大部分对象都在堆区上分配的(对象可以在栈上分配,或者标量替换)。可以通过 -Xms(堆启动大小)-Xmx(堆最大大小)

5方法区
用于存放,已经加载的类信息,常量,静态变量等。常量池也是方法区的一部分,用于存放一些字符常量等。永久代,在JDK8中已经被移除。

6对象的创建
1 当执行new时,会先去方法区(常量池)中定位一个类是否被加载,如果没被加载,则进行类的加载,反之继续进行的类实例化

2类的实例化第一步是给类划分内存区域,区域的大小在类记载进来的时候就已经确定了
2-1 内存的分配,有2种,一是指针碰撞,就是通过一个标记量把内存划分为一个已使用的区域和未被使用的区域,通过标记量向未使用的区域移动一个等大小的距离就可以了,这种方式叫做指针碰撞,使用于带空间压缩的收集器。另一种就是适用用,CMS算法收集器的算法,这种方法需要一个内存空间空闲表来实现
2-2 内存空间分配完了,会给对象附上零值即默认值,随后执行Init()把所有变量进行赋值,包括父类,随后直接构造器方法

3对象的布局分为3个部分
3-1对象头
深入理解JAVA虚拟机----------JAVA内存区域划分
另外一部分就是执行Class的指针,对于数组对象,还需要额外的空间来来存放数组长度。

7对象的定位
句柄方式
深入理解JAVA虚拟机----------JAVA内存区域划分深入理解JAVA虚拟机----------JAVA内存区域划分
句柄访问最大好处就是reference中存储稳定的句柄地址,对象被移动是,只改变句柄中的实例数据指针,而reference不需要改变。直接指针访问方式最大好处就是速度快,对HotSpot而言使用第二种方式进行对象访问

8 如果进行GC后reference是如何确定的实例对象的
GC一般通过的是GCroot开始进行深度遍历的,对象有2个变量,一个visit,一个forward,把对象Copy到新区域,并修改visit为true,并把forward的修改为新对象的地址。如果一个对象已经被访问了,那么久直接返回这个forward修改指向。

9 String.intern()
在JDK6中会,如果常量池不存在,则会拷贝一份到常量池中并返回引用,
jdk7中如,如果常量池中不存在,那么则拷贝一份引用到中,并返回引用。