Java 虚拟机
# 运行流程
# 组件
程序计数器 | 类似组成原理中pc寄存器,线程私有,记录运行的位置 |
堆 | 线程共享,数组,对象。年轻代+老年代(Eden,幸存区) |
栈 | 每个线程一个栈,一个栈多个栈帧(方法)。存放方法内的局部变量,栈内存溢出(递归)。 |
方法区、元空间 | 线程共享。Class,ClassLoader,运行时常量池 |
直接内存 | 操作系统的内存 |
# 类加载器
将字节码文件加载到JVM中
- 启动类加载器:加载JAVA_HOME/jre/lib目录下的库
- 扩展类加载器:加载JAVA_HOME/jre/lib/ext目录中类
- 应用类加载器:加载classPath下的类
- 自定义加载器
# 双亲委派
踢皮球,避免一个类被重复加载。保证类库API不会被修改
# 类装载
# 垃圾回收
- 引用计数法
- 可达性分析
- 标记清除法
- 标记整理算法
- 复制算法
- 新生代回收
- 老年代回收
- MinorGC
- Mixed GC
- Full GC
- G1
# 强引用、软引用、弱引用、虚引用
User user = new User();
// 软引用:垃圾回收多次后还是内存不足,就会回收
SoftReference softReference = new SoftReference(user);
// 弱引用:只要进行了垃圾回收,就会回收
WeakReference weakReference = new WeakReference(user);
ReferenceQueue referenceQueue = new ReferenceQueue();
// 虚引用,被引用的对象回收时,会回收
PhantomReference phantomReference = new PhantomReference(user, queue);