Java对象布局 64bits

  • 对象头 96 bit(128bit)
    • Mark Word 64bit
      • 对象hashcode 32
      • CG分代年龄
    • Klass pointer (类指针) 64bit (是否开启指针压缩)
  • 实例数据
  • 填充数据:保证Java对象大小为8byte的倍数

image.png

java虚拟机

通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离的计算机系统
jvm通过软件模拟java字节码指令集,是java程序的运行环境

image.png

  1. 类装载系统,用于装载class到运行时数据区
  2. 运行时数据区(内存模型 )
    1. 堆 (线程共享)
    2. 元空间 (线程共享)
      1. 常量池
    3. 栈(线程) (线程私有)
    4. 本地方法栈 (线程私有)
    5. 程序计数器 (线程私有)
  3. 执行引擎

    堆的组成

  • 年轻代 1/3 Yong GC[Minor GC]
    • Eden 8/10
    • S0 1/10 (复制算法) 对象头(Markword中年龄+1)
    • S1 1/10
  • 老年代 2/3 (标记整理) STW较长 Full GC

image.png
新生代为什么伊甸园区(Eden)默认为8
因为java程序的创建对象最先在Eden区域,绝大部分对象创建后就是可回收对象,因此Eden区域设计的较大。

JVM主要功能

  1. 通过ClassLoad寻找和装载class文件
  2. 解释字节码并解释成指令命令并执行,提供class文件运行的环境
  3. 进行运行期间的内存分配和垃圾回收
  4. 提供与硬件交互的平台

    Jvm虚拟机规范作用

  • java虚拟机规范为不同的硬件品台提供了一种编译java技术代码的规范
  • 该规范使Java软件独立于平台,因为编译时针对java虚拟机来做的

    JVM规范定义内容

  • 字节码指令集

  • class文件格式
  • 数据类型和值
  • 运行时数据区
  • 栈桢
  • 特殊方法
  • 类库
  • 异常
  • 虚拟机的启动、加载、链接和初始化


    image.png

    双亲委派机制:

    jvm的类加载器是有亲子层级结构的,就是说启动类加载器最上层,扩展类加载器在第二层,第三层是应用程序类加载器,最后一层是自定义类加载器。
    假设你的应用程序类加载器需要去加载一个类,它首先会委派给自己的父类加载器去加载慢最终导致顶层的类加载器去加载。但是如果父类加载器在自己负责的范围内,没有找到这个类,那么就会下推加载权利给自己的子类加载,避免了多层级的类加载器结构重复加载某些类。
    类加载器和双亲委派机制:

  1. 启动类加载器:Bootstrap ClassLoader,主要负责加载我们在机器上安装的java目录下的核心类(lib 核心类库)
  2. 扩展类加载器:Extension CalssLoader,与上面类似,加载lib\ext
  3. 应用程序加载器:Application ClassLoader,这个类加载器负责去加载ClassPath 环境变量制定的路径的类。理解成你写好的java代码
  4. 自定义类加载器

image.png