JVM常见问题总结
1、Java的四种引用
- 强引用
- 软引用
- 弱引用
- 虚引用
2、JVM内存模型:Java的内存划分
- 程序计数器
- Java虚拟机栈
- 本地方法栈
- 堆内存
- 方法区
- 字符常量池
3、Java中对象在内存中的状态
- 可达的/可触及的
- 可恢复的
- 不可达的
4、判断对象是否已死的两种常用算法
- 引用计数算法
- GCRoot根搜索算法
5、JVM垃圾回收算法
- 标记-清除
- 复制:新生代的gc
- 标记-整理:老年代的gc
- 分代收集算法
6、垃圾收集器
- Serial收集器:client模式下的新生代收集器
- Serial Old收集器:client模式下的老生代收集器
- ParNew收集器:server模式下的首选新生代收集器(Serial收集器的多线程版本)
- parall Scavenge收集器:更关注吞吐量
- parall Old收集器:parall Scavenge收集老年代版本
- G1收集器:更关注停顿时间
- CMS收集器:并发标记-清除,获取最短停顿时间为目标,老年代收集器
7、Java堆内存划分
- 老年代
- 新生代
- 永久代
8、MinorGC、FullGC
9、类加载机制
- 类的加载过程
- 加载:将类的class文件读入内存,并创建java.lang.Class对象
- 链接
- 验证:class文件格式、语法语义等
- 准备:为static静态域做默认初始化并在方法区分配内存空间
- 解析:将
符号引用
替换为直接引用
- 初始化(显示)
- 创建类的实例
- 访问类或接口的静态变量(final static修饰的常量不会对类进行显示初始化)
- 调用类的静态方法
- 反射(Class.forName)
- 初始化类的子类
- java虚拟机启动时被标记为启动类的类
10、类加载器
- 类加载器
- 双亲委派模型:深入分析ClassLoader
- 启动类:Bootstrap ClassLoader
- 拓展类:Extension ClassLoader
- 应用程序类:Application ClassLoader
- 自定义:User ClassLoader
- ClassLoader的生命周期:加载(loading)-> [验证(verfication)- 准备(preparation)- 解析(Resolver)](连接 linking) -> 初始化(init)->
使用(Using)-> 卸载(unloading)