1. 内存区域

内存分区 - 图1

方法区:

  • JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域;
  • 会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据

image.png

线程私有

程序计数器

程序执行到哪一行,方便cpu 切换后,能找到位置;

java虚拟机栈

方法入口、出口、局部变量表

本地方法栈

本地方法

线程共享

堆内存

存放对象的实例;垃圾回收的主要区域

元空间

元空间使用的是直接内存,不容易造成内存溢出;

  • 运行时常量池

直接内存

2.对象

类的加载

image.png

加载:
将类的字节流加载进虚拟机;
连接:
验证字节码 文件头魔术是否正确;
初始化:
生成类的静态变量;

对象的创建过程

image.png

分配空间

两种方式:

1)指针碰撞

2)空闲列表

设置初始值

设置对象头

执行init操作

对象的内存分布;

分为三部分:对象头、示例数据、对其填充

对象的访问定位

内存分区 - 图5

句柄优势:在对象被移动时只会改变句柄中的实例数据指针,reference 本身不会被更改;直接指针就是快

参见