1.JVM类加载分类和核心功能
- 启动类加载器(Bootstrap ClassLoader):加载核心类,String类
- 扩展类加载器(Extension ClassLoader):加载扩展类,拓展Java中比较通用的类
- 应用程序类加载器(Application ClassLoader):加载应用classpath中的类,包括自己写的类,还有第三方Jar包的类
- 自定义类加载器(Java实现):需要重写findClass方法。
2.类加载双亲委派机制
-
双亲委派机制:先找父类加载加载,不行再由子类加载器自己加载
-
沙箱安全机制:防止核心库API背篡改
-
避免类的重复加载:父类加载该类时,子类不需要再重复加载,保证加载类的唯一
3.tomcat底层类打破了双亲委派机制
- 一个tomcat容器可能会部署多个应用,不同应用的依赖不同类库或同一类库不同版本
- 每个应用程序独立运行,不依赖其他程序,相互隔离
4.对象完整创建流程
- 类加载器检查,类是否加载,未加载,先加载
- 分配内存,确定所需内存大小,在堆中划分内存空间
- 初始化零值,将分配内存空间初始化零值(附默认值)
- 设置对象头,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息
- 执行init方法,即为属性赋值和执行构造方法
5.可达性分析算法标记垃圾对象
将GC ROOTS对象作为起点,从这些节点开始向下搜索引用的对象,将其标记为标记为非垃圾对象,其余未标记的对象都是垃圾对象。
GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等
6.CMS收集器收集过程
CMS收集器是一种 “标记-清除”算法实现,共分为4个步骤
-
初始标记:暂停所有的其他线程(STW),并记录下gc roots直接能引用的对象,速度很快
-
并发标记:是从GC Roots的直接关联对象开始遍历整个对象图的过程, 这个过程耗时较长但是不需要STW, 可以与垃圾收集线程一起并发运行。因为用户程序继续运行,可能会有导致已经标记过的对象状态发生改变。
-
重新标记:修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录(主要是处理漏标问题),这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。主要用到三色标记里的增量更新算法(见下面详解)做重新标记
-
并发清理:开启用户线程,同时GC线程开始对未标记的区域做清扫。这个阶段如果有新增对象会被标记为黑色不做任何处理(见下面三色标记算法详解)。
-
并发重置:重置本次GC过程中的标记数据。