第二章
一 运行时数据区域
1 程序计数器:在线程切换的过程中通过程序计数器定位线程执行到哪一步。
2 Java虚拟机栈:用于存放方法的入口,局部变量表,动态链接,操作数栈。
3 本地虚拟机栈:和Java虚拟机类似,但是他只能为本地方法服务。
4 Java堆:用于存放对象实例,也是垃圾收集器的管理的地方。
5 方法区:用于存放常量,静态常量,被虚拟机加载之后的类型信息。
二 Hotspot虚拟机对象
1 创建对象:要给对象分配内存时,不同的垃圾收集器会选用不同的分配方式 1 指针碰撞 : 分配的内存空间是连续的。
2 空闲链表: 在空闲和以使用的内存空间交错时,使用空闲链表分配内存。
1.1 如果频繁的创建对象就会使线程不安全:1 同步处理 通过CAS+失败重试 保证操作的原子性。
2 本地线程缓存分配 在每一个线程分配一块内存,只有使用完了本地线程,在分配新的缓存区时,才会进行同步锁定。
2 对象的内存布局: 1 对象头中俩类信息: 1)存储对象自身的运行时数据(又称“mark word” 其设计为一个动态定义的数据结构)。
2)类型指针: 主要是识别该实例是属于哪个类。
2 实例对象:主要时程序代码中各种类型的字段内容,包括继承父类的,自己子类的信息。
3 对齐填充:仅仅作为占位符(可有可无)。
3 对象的访问定位: 1 通过句柄:首先储存在句柄池中,然后在句柄池中句柄中包括的信息有 指向对象实例数据的指针和指向对象类型数据的指针
优势:存储在稳定的句柄池,如果对象被移动(垃圾收集时对于对象的移动)只需要修改句柄池中指向对象实例数据的指针即可。
2 直接指针:存储的信息有 对象实例数据和指向对象类型数据的指针
优势:主要访问速度快,只需访问对象类型数据指针。
未完待续!!!