目录
1.AQS全称和组成部分有哪些?它的基本原理是什么?
2.类加载器的分类有哪些?并解释什么是双亲委派机制(一定要描述如何违背双亲委派和典型实现)
3.如何判断一个对象为垃圾对象? 哪些对象可以作为GCRoot集合中对象?
4.垃圾回收算法有哪些?(包含各自优缺点)
1.AQS全称和组成部分有哪些?它的基本原理是什么?
AbstractQueueSynchronizer 抽象队列同步器
组成 FIFO阻塞队列,int类型的state状态值
基本原理 子类需要重写锁被protected修饰的方法 用于修改state的值 来表示acquire上锁和release释放锁的流程, state=0 表示未上锁 state=1 表示上锁,并且没有重入, state>1 表示上锁 并且重入
2.类加载器的分类有哪些?并解释什么是双亲委派机制(一定要描述如何违背双亲委派和典型实现)
bootstrapClassLoader 根加载器 由c++实现 主要负责加载jdk中rt.jar包中信息
ExtClassLoader 扩展类加载器 java 实现 主要负责加载除了rt.jar 之外的其他jar包
AppClassLoader 应用类加载器 主要负责加载器导入的第三方jar包
自定义类加载器 用的级少 一旦要是自定义了类加载器 他就会违背双亲委派
类加载器(ClassLoader)不仅负责加载类的字节码文件,还要确保类的正确加载和防止类的重复加载。双亲委派机制通过一个层次结构的类加载器模型来实现这一点,确保了类的唯一性和安全性。
双亲委派机制 很少自定义类加载器,通常加载一个类到内存中一般只涉及系统提供三个类加载过程 ,从应用类加载开始加载 第一次加载不会真正的区加载 他将加载任务 委托给父类 扩展类加载器
扩展类加载器也有负责 扩展类加载也会将请求委托给根加载器 此时根加载器由于没有父类 他会加载tr.jar包中类信息 执行第一次加载
如果获取不到 则委派给他的子类 扩展类加载器 从jar包之外的其他jar包中加载类信息
如果扩展类加载器也无法加载 此时委派给应用类加载器从而导入的第三方jar包中完成类信息的加载过程
如果自定义的jar中也没有找到,说明该类不存在 抛出异常 classNotFoundException
自定义类继承 作为自定义类加载器 重写loadclass()方法 不让执行双亲委派机制逻辑 从而打破双亲委派的, spi机制是一种服务发现机制,它通过 classPath 路径下的META-INF/services 文件夹查找文件 自动加载文件里所定义的类 这一机制为很多框架扩展提供可能
具体实现 tomcat 自定义类继承 classloader 违背的
jdk spi机制导致双亲委派机制
3.如何判断一个对象为垃圾对象? 哪些对象可以作为GCRoot集合中对象?
不在被任何引用所使用的对象
不可达性 一个对象没有任何引用指向它 或者只能通过已被垃圾收集器标记为 可被回收的对象才能到达它,那么这个对象就是不可达的 ,被视为垃圾
虚拟机栈中的局部变量,当前正在执行的方法内的局部变量表中的对象引用
本地方法栈中的对象:本地方法中JNI引用的对象。
方法区中的静态字段:类静态属性所引用的对象
4.垃圾回收算法有哪些?(包含各自优缺点)
标记清除算法 优点:简单异实现 ,可以有效的回收大量的无用对象
缺点:标记和清除两个过程都会导致系统暂停,影响应用性能,
连续回收后会导致内存空间零散,难以分配大对象
复制算法 优点: 每次都是对一块区域进行操作,清理过后是整块的内存区域,只需要处理存活对象,不用遍历所有对象,只需要处理存活对象,不用遍历所有对象
缺点 需要两倍的内存空间 适用于新生代,尤其是Eden区和Survivor区之间的复制
分代收集算法 优点: 新创建的对象放在新生代,频繁回收,减少垃圾收集对老年代的影响, 结合使用 新生代使用复制算法,老年代使用标记-整理算法
缺点: 需要维护多个区域的划分和转移逻辑