1.类加载机制
类加载过程:加载-验证-准备-解析-初始化-使用-卸载
2. 双亲委派机制
1、根类加载器(Bootstrap classLoader):负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等
2、扩展类加载器(ExtClassLoader):负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包
3、应用加载器(AppClassLoader):负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类,负责加载用户自定义路径下的类包
为什么要设计双亲委派机制
1、沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
2、避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性
全盘委托机制
全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入
3. tomcat怎么破解类加载机制
4. 内存模型
私有区域
程序计数器、虚拟机栈、本地方发栈
线程共享栈
堆区->运行时数据区
是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。
采用分代收集算法
方法区/永久代
用于存储被 JVM 加载的类信息**、常量、静态变量、**即时编译器编译后的代码等数据.
HotSpot VM把GC分代收集扩展至方法区, 即使用Java堆的永久代来实现方法区, 这样 HotSpot 的垃圾收集器就可以像管理 Java 堆一样管理这部分内存, 而不必为方法区开发专门的内存管理器(永久带的内存回收的主要目标是针对常量池的回收和类型的卸载, 因此收益一般很小)。
5. 对象的创建
类加载机制->是否已加载类->(加载)->初始化->设置对象头->执行方法
6. 对象分配过程
栈上分配
逃逸分析
标量替换
标量与聚合量
7. 判断一个类是无用类
该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。
加载该类的 ClassLoader 已经被回收。
该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
8. finalize()方法最终判定对象是否存活
- 第一次标记并进行一次筛选。
筛选的条件是此对象是否有必要执行finalize()方法。
当对象没有覆盖finalize方法,对象将直接被回收。
- 第二次标记
如果这个对象覆盖了finalize方法,finalize方法是对象脱逃死亡命运的最后一次机会,如果对象要在finalize()中成功拯救 自己,只要重新与引用链上的任何的一个对象建立关联即可,譬如把自己赋值给某个类变量或对象的成员变量,那在第 二次标记时它将移除出“即将回收”的集合。如果对象这时候还没逃脱,那基本上它就真的被回收了。