JVM笔记(3)--第二章 总结

  第二章

  一 运行时数据区域

    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 直接指针:存储的信息有 对象实例数据和指向对象类型数据的指针

                                                优势:主要访问速度快,只需访问对象类型数据指针。

未完待续!!!                                                   

原文地址:https://www.cnblogs.com/linyu1/p/13789634.html