类加载的过程
classLoader.loadClass的类加载过程有如下几步:
加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载
其中验证、准备、解析这三步被称为链接,如上图所示
反射中Class.forName()和ClassLoader.loadClass()的区别
两者最大的区别
Class.forName得到的class是已经初始化完成的
Classloder.loaderClass不会执行类的初始化
https://www.cnblogs.com/suibianle/p/6676215.html
类加载器的分类
- 引导类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、charsets.jar等
- 扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包
- 应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类
- 自定义加载器:负责加载用户自定义路径下的类包
什么是双亲委派机制
加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。
比如我们的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就自己加载,在自己的类加载路径里也没找到Math类,又向下退回Math类的加载请求给应用程序类加载器, 应用程序类加载器于是在自己的类加载路径里找Math类,结果找到了就自己加载了。。
双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载
这个博客写的十分不错
为什么要设计双亲委派机制?
- 沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
- 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性
jvm的基本结构
- 方法区(元空间)
存放常量+静态变量+类信息 - 堆
- 栈
- 本地方法栈
-
程序计数器
其中栈、本地方法栈、程序计数器是线程隔离的,其他是线程共享的
上图是一张完整而详细的jvm结构图
常见的垃圾回收算法
- 引用计数法(已淘汰)
- 复制算法
-
标记清除算法
-
标记整理算法
如何判断一个对象是否可以被回收
- 引用计数法(以淘汰)
- gc root做可达性分析
Java中可以作为GC Roots的对象
- 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
- 方法区中的类静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中JNI(Native方法)引用的对象
Minor GC/Young GC
指发生新生代的的垃圾收集动作
- 当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到From区,当Eden区再次触发GC的时候会扫描Eden区和From区域,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域(如果有对象的年龄已经达到了老年的标准,则赋值到老年代区),同时年龄+1。
- 清空Eden和From
- To和Survivor From互换。部分对象会在From和To区域中复制来复制去,如此交换15次(由ⅣM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代。
垃圾收集器的分类
-
串行垃级回收器(Serial)
它为单线程环境设计且值使用一个线程进行垃圾收集,会暂停所有的用户线程,只有当垃圾回收完成时,才会重新唤醒主线程继续执行。所以不适合服务器环境。 -
并行垃圾回收器(Parallel)
多个垃圾收集线程并行工作,此时用户线程也是阻塞的,适用于科学计算 / 大数据处理等弱交互场景,也就是说Serial 和 Parallel其实是类似的,不过是多了几个线程进行垃圾收集,但是主线程都会被暂停,但是并行垃圾收集器处理时间,肯定比串行的垃圾收集器要更短。 -
并发垃圾回收器(CMS)
用户线程和垃圾收集线程同时执行(不一定是并行,可能是交替执行),不需要停顿用户线程,互联网公司都在使用,适用于响应时间有要求的场景。 -
G1垃圾回收器
G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。
ZGC(Java 11的,了解)
四大回收算法、七大垃圾收集器
标记清除、复制算法、标记整理、分代收集
Serial, SerialOld, ParNew, Parallel Scavenge, Parallel old, CMS, G1
判断对象是否已经死亡的算法
引用计数法、可达性分析算法







网友评论