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服务器热部署的实现原理