bilibili-JVM学习笔记19
The Java Virtual Machine Specification - Java SE 8 Edition
基于 java 1.8.0
JVM内存空间划分与作用详解
- 虚拟机栈
- 线程私有 ,伴随着线程的生命周期
- 栈帧(Stack Frame)
- 每个方法在执行时都会生成一个与这个方法执行相关的栈帧
- 存储
操作数栈
的数据 - 存储
局部变量表
- slot
- 方法的返回地址(方法出口)
- 程序计数器(PC : Program Counter)
- 线程私有
- 占用很小
- 本地方法栈
- 主要用于处理本地方法(native method)
- c or c++
- hotspot vm 将本地方法栈和虚拟机栈合二为一了
- 堆(Heap)
- 线程共享
- 现代几乎所有的
垃圾收集器
都是采用的分代收集算法
- 新生代
- 伊甸区
- From 幸存区
- To 幸存区
- 老年代
- 方法区(Method Area)
- 存储类的
元数据
(Class类对象
,而不是类的实例对象) - 运行时常量池
- 永久代,从jdk1.8开始废弃永久代,使用元空间
- 存储类的
- 直接内存
- 堆外内存 Direct Memory
- 与 Java NIO 密切相关
- JVM 通过堆上的 DirectByteBuffer 来操作直接内存
虚拟机栈的结构
Java对象内存分配原理与布局
-
java 对象创建的过程
- new 关键字创建对象
-
- 在堆内存中创建对象的实例
-
- 为对象的实例成员变量赋初值
-
- 将对象的引用返回
-
- new 关键字创建对象
-
指针碰撞
- 堆空间通过一个指针进行分割,一侧是已经被占用的空间,另一侧是未被占用的空间;
-
空闲列表
- 虚拟机通过一个列表来记录哪些空间是空闲的,哪些空间是已被使用的;创建对象需要空间时在空闲列表中找到可以容纳的空间大小分配给该对象,并对空闲列表记录进行修改;
- 对象内存布局
- 对象头
- 实例数据
- 对齐填充
引用访问对象的方式:
-
句柄访问
-
直接访问