谈谈你对jvm 的理解;
1.jvm 的位置
jvm 首先运行在操作系统上。常见的win10 linux mac 虚拟机软件。
jvm 操作系统打交道 jvm 是用c语言写的
jvm 体系架构
2.体系结构
3.类加载器
。gc 垃圾回收
JAVA 双亲委派机制
2 什么是双亲委派机制
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,子加载器才会尝试自己去加载。
总结就是
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;
如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
Bootstrap 类加载器是用 C++ 实现的,是虚拟机自身的一部分,主要负责加载核心的类库。如果获取它的对象,将会返回 null;
扩展类加载器和应用类加载器是独立于虚拟机外部,为 Java 语言实现的,均继承自抽象类 java.lang.ClassLoader ,开发者可直接使用这两个类加载器。
Application 类加载器对象可以由ClassLoader.getSystemClassLoader()方法的返回,所以一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
用户自定义类加载器(Custom ClassLoader):可加载指定路径下的class文件。
双亲委派机制工作流程
当Application ClassLoader 收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader去完成。
当Extension ClassLoader收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap ClassLoader去完成。
如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载。
如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载。
如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。
如果均加载失败,就会抛出ClassNotFoundException异常。