1. 内存区域
方法区:
- JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域;
- 会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据
线程私有
程序计数器
程序执行到哪一行,方便cpu 切换后,能找到位置;
java虚拟机栈
方法入口、出口、局部变量表
本地方法栈
本地方法
线程共享
堆内存
存放对象的实例;垃圾回收的主要区域
元空间
元空间使用的是直接内存,不容易造成内存溢出;
- 运行时常量池
直接内存
2.对象
类的加载
加载:
将类的字节流加载进虚拟机;
连接:
验证字节码 文件头魔术是否正确;
初始化:
生成类的静态变量;
对象的创建过程
分配空间
两种方式:
1)指针碰撞
2)空闲列表
设置初始值
设置对象头
执行init操作
对象的内存分布;
分为三部分:对象头、示例数据、对其填充
对象的访问定位
句柄优势:在对象被移动时只会改变句柄中的实例数据指针,reference 本身不会被更改;直接指针就是快