JVM_类加载器

43 阅读1分钟

类加载器有哪些?

  • bootstrap类加载器(引导类加载器):加载String.class等jdk的核心类,但这个是c++实现的(本地方法)
  • ext类加载器(扩展类加载器):加载ext包下的类
  • app类加载器(应用程序类加载器):自己实现的代码

什么是双亲委培规则?

先从app类加载器开始加载类,若已经加载过则直接返回,若没有加载过先向上找看扩展类加载器是否加载过,若加载过直接返回,若没加载过再向上委托看引导类加载器是否加载过,若加载过则直接返回,若没有加载过在路径上需找是否存在该类,若存在加载后返回,若无法加载再让扩展类加载器查找,后面同理。

为什么类加载器要从app类加载器开始?

因为95%的需要的类都是应用程序的类,那么从这儿开始若加载过直接就返回了。

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

  • 沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心api库被篡改替换
  • 避免类的重复加载,若父类已经加载过了,那么子类就没有必要再加载了。

类加载的过程

java代码->编译打包(class文件)->加载(验证、准备、解析、初始化)->jvm 使用->加载类 类被加载到方法区中后主要包含运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应的class实例引用。

打破双亲委派机制

不让父类去加载,自己去加载 继承classloader类,重写loadclass方法