1. 内存模型
线程独享: 虚拟机栈, 本地方法栈, 程序计数器
线程共享: 堆, 方法区
2. 虚拟机栈的作用
存放栈帧, 栈帧又包含局部变量表, 每个方法从被调用到执行结束的过程都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
3. 程序计数器
存放下一条指令的信息
4. 堆
Java堆是被所有线程共享的区域, 存放几乎所有的对象实例, 是垃圾回收器管理的区域
5. 方法区
存放已加载的类信息, 常量, 静态变量, 编译后的代码缓存
6. 对象的内存布局
-
对象头:
- 存储对象自身的运行时数据, 如锁状态, GC年龄分代, 线程持有的锁
- 类型指针, 指向它的类型元数据,
- 如果对象是个数组, 那么还有一块用于记录数组长度的数据,
-
实例数据:程序代码里定义的各种类型的字段.这部分的顺序会收到虚拟机分配策略参数的影响.
-
对齐填充: 不是必要的, 但是必须保证任何对象的大小都是8字节的整数倍
7. 对象时如何访问定位的
- 句柄访问
- 直接指针访问
8. 对象已死
-
引用计数法
-
可达性分析
9. 引用
- 强引用: 最传统的引用, 无论在任何情况下, 只有有强引用, 就不会被回收
- 软引用: 用来描述还有用, 但是非必要的对象, 在系统将