JVM-Java工程师必须掌握的知识点
JVM
1、JVM基本概念:JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。
2、内存模型
方法区----存储类信息、静态变量
虚拟机栈----线程私有
本地方法栈----本地方法变量存储区
堆----对象存储区
程序计数器----控制程序执行顺序
3、堆
新生代----Eden区、S0、S1
老年代----大对象和S0、s1转移的对象
持久代----是方法区的实现,主要存放所有已加载的类信息,方法信息,常量池
Tips:面试官如果问这个数字,必须答出来。新生代占比:6:1:1,新生代和老年代比例为1:3
4、GC
标记垃圾算法:
引用计数法----淘汰,原因是会出现相互依赖问题
可达性算法----GC树
Root节点:栈帧本地变量表引用对象、本地方法引用对象、方法区常量引用对象、方法区静态变量引用的对象(词语是不是很模糊,LZ也很模糊)
回收算法
标记-清除----每个对象如果标记清除,GC时会被回收,缺点在于内存碎片较多,产生后果就是浪费空间
标记-整理----把标记的对象转移到另一块一样的,空间换时间
分代回收----根据不同区域特点设置不同策略回收,新生代采取标记整理,老年代采取标记清除
Tips:面试官如果问为什么Java采取这个分而治之算法呢?可以这样回答:新生代转成老年代对象很快,内存空间较少,GC频率较多,所以在新生代有分区概念;而老年代对象基本不会动,GC几率较少,且都是大对象,用标记整理最合适。这样使整体GC效率提高
5、类加载
流程
- 类加载
- 类连接
- 类初始化
- ...
类加载器
Bootstrap加载器----lib\rt.jar 包含了很多Jdk原有的类class文件
Extension加载器----lib\ext*.jar
App类加载器----classpath
自定义加载器----自定义加载类
双亲委派模式加载
- 主要是为了校验,不让编程者破坏jre运行环境
- 运用自定义类加载器可以实现热部署. Java服务器热部署的实现原理