深入理解jvm第二章读书笔记

深入理解jvm第二章读书笔记_第1张图片

本文直接从第二章的主要内容开始记录(第一章主要是java的发展历程等内容 有兴趣可自查)

 

深入理解jvm第二章读书笔记_第2张图片

上图运行时数据区中 方法区和堆是线程共享、虚拟机栈、本地方法去、程序计数器为私有

程序计数器

        程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址

java虚拟机栈

        虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都 会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信 息每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。我们常说的方法入栈出栈,就是方法作为一个栈帧入栈,执行完毕便出栈。

本地方法栈

        本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。

Java堆

        虚拟机中管理的最大一块内存,Java堆是被所 有线程共享的一块内存区域,本内存区域主要存放对象实例。在《Java虚拟机规范》中对Java堆的描述是:“所有 的对象实例以及数组都应当在堆上分配(但在技术日渐强大的现在,这一点不在绝对,但目前为止还是可以这样认为)

        如果从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区 (Thread Local Allocation Buffer,TLAB)将Java 堆细分的目的只是为了更好地回收内存,或者更快地分配内存

       java堆可以在物理上不连续,但在逻辑上是连续的。

  方法区

        存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据,这里简单介绍一下类信息——Class类被创建后的对象就是Class对象,注意,Class对象表示的是自己手动编写类的类型信息,比如创建一个Shapes类,那么,JVM就会创建一个Shapes对应Class类的Class对象,该Class对象保存了Shapes类相关的类型信息。

深入理解jvm第二章读书笔记_第3张图片

运行时常量池

         运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字 段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生 成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

对象创建

        主要了解“指针碰撞”和“空闲列表”,假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一 边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那 个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump The Pointer)。但如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那 就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分 配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称 为“空闲列表”(Free List)选择哪种内存分配方式取决于java堆采用的垃圾收集器功能。

对象在堆中的存储布局

        对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例 数据(Instance Data)和对齐填充(Padding)。

        1.对象头:包含两类信息 第一类是用于存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分成为Mark Word

 

深入理解jvm第二章读书笔记_第4张图片对象头的另外一部分是类型指针,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针 来确定该对象是哪个类的实例。

2.接下来实例数据部分是对象真正存储的有效信息,即我们在程序代码里面所定义的各种类型的字 段内容,无论是从父类继承下来的,还是在子类中定义的字段都必须记录起来。

3.对象的第三部分是对齐填充,这并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作 用。由于HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍。

你可能感兴趣的:(java)