jvm相关面试题

2022-03-07  本文已影响0人  mundane

类加载的过程


classLoader.loadClass的类加载过程有如下几步:
加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载


其中验证、准备、解析这三步被称为链接,如上图所示

反射中Class.forName()和ClassLoader.loadClass()的区别

两者最大的区别
Class.forName得到的class是已经初始化完成的
Classloder.loaderClass不会执行类的初始化
https://www.cnblogs.com/suibianle/p/6676215.html

类加载器的分类

什么是双亲委派机制


加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。
比如我们的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就自己加载,在自己的类加载路径里也没找到Math类,又向下退回Math类的加载请求给应用程序类加载器, 应用程序类加载器于是在自己的类加载路径里找Math类,结果找到了就自己加载了。。
双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载

https://www.cnblogs.com/cb1186512739/p/12734050.html

这个博客写的十分不错

为什么要设计双亲委派机制?

https://www.cnblogs.com/enroute/p/13865807.html

jvm的基本结构

  1. 方法区(元空间)
    存放常量+静态变量+类信息
  2. 本地方法栈
  3. 程序计数器
    其中栈、本地方法栈、程序计数器是线程隔离的,其他是线程共享的



    上图是一张完整而详细的jvm结构图

常见的垃圾回收算法

  1. 引用计数法(已淘汰)
  2. 复制算法
  3. 标记清除算法


  4. 标记整理算法


如何判断一个对象是否可以被回收

  1. 引用计数法(以淘汰)
  2. gc root做可达性分析

Java中可以作为GC Roots的对象

Minor GC/Young GC


指发生新生代的的垃圾收集动作

  1. 当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到From区,当Eden区再次触发GC的时候会扫描Eden区和From区域,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域(如果有对象的年龄已经达到了老年的标准,则赋值到老年代区),同时年龄+1。
  2. 清空Eden和From
  3. To和Survivor From互换。部分对象会在From和To区域中复制来复制去,如此交换15次(由ⅣM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代。

垃圾收集器的分类

四大回收算法、七大垃圾收集器

标记清除、复制算法、标记整理、分代收集
Serial, SerialOld, ParNew, Parallel Scavenge, Parallel old, CMS, G1

判断对象是否已经死亡的算法

引用计数法、可达性分析算法

上一篇 下一篇

猜你喜欢

热点阅读