引言
一、内存结构
程序计数器
定义
作用
虚拟机栈
定义
栈内存溢出
- 栈帧过多导致栈内存溢出
- 栈帧过大导致栈内存溢出
线程运行诊断
本地方法栈
堆
定义
Heap 堆
- 通过 new 关键字,创建对象都会使用堆内存
特点
- 它是线程共享的,堆中对象都需要考虑线程安全的问题
- 有垃圾回收机制
堆内存溢出
堆内存诊断
方法区
直接内存
定义
Direct Memory
- 常见于 NIO 操作时,用于数据缓冲区
- 分配回收成本较高,但读写性能高
- 不受 JVM 内存回收管理
分配和回收原理
- 使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法
- ByteBuffffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffffer 对象,一旦
- ByteBuffffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调
- 用 freeMemory 来释放直接内存
二、垃圾回收
如何判断对象可以回收
引用计数法
可达性分析算法
四种引用
垃圾回收算法
标记清除
标记整理
复制
分代垃圾回收
垃圾回收器
垃圾回收调优
三、类加载器
类文件结构
魔数
版本
常量池
。。。
详细的参考下面的视频的
访问标识与继承信息
Field信息
Method信息
附加信息
字节码指令
入门
javap工具
图解方法执行流程
原始java代码
编译后字节码文件
常量池载入运行时常量池
方法字节码载入方法区
main线程运行,分配栈帧
- 局部变量表
- 操作数栈
执行引擎开始执行字节码
。。。
。。。
。。。
练习分析
略。。。
条件判断指令
循环控制指令
练习判断结果
结果:0 分析:x = x++ 过程:
- 将局部变量x的值0加载到操作数栈
- 局部变量x的值++,变成1
- 将操作数栈的0再赋值给局部变量x,故又变成0;
构造方法
()V
整个类的构造方法
最终结果为:30,覆盖了,以最后的为准
()V
对象的构造方法