jvm-类加载器

149 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

类加载器

用处:加载Class文件,加载动作的第一步,通过类加载器的权限定名,将二进制流文件放入JVM中,这个动作就是类加载器,在JVM外部执行。

任意一个类,通过加载它类的加载器和类本身才能确认类的唯一性。

通俗的讲:一个类只有被同一个类加载器加载,才能相同,只要被不同的类加载器加载,哪怕来源于同一个类,他们也不相同

  • 有哪些加载器?

1.启动加载器:ApplicationClassLoader,将classpath路径下的类加载

2.扩展类加载器:ExtentionClassLoader,将拓展类目录的加载器加载到JVM中

3.系统类加载器:BootStrapClassLoader:将核心类库加载到JVM中

4.自定义类的加载器:继承ClassLoader。

双亲委派机制

  • BootstrapClassLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。 由C++实现,无法在java中获取,所以会显示null
  • ExtentionClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
  • AppClassLoader:主要负责加载应用程序的主函数类:classpath下的内容

类加载器会先在扩展加载器中寻找是否有这个类,如果有就会执行扩展加载器中的

ApplicationLoader -> ExtClassLoader-> BootStrapclassLoader

当加载一个类时,先从最内层的加载器开始加载,如果有就使用该类,如果没有,从外层的加载器中找。如果一层层找下来没有就Class not

found

所以如果自己写了一个类名String为类,实际上在并不会去加载这个类,而是执行BootStrapLoader中的String类。

image-20210403231802095

  • 为什要使用这种机制?

防止系统的类被替换,一定程度上防止了危险代码的注入。

沙箱安全机制

本地的代码时可以信任的,但是远程的代码不一定可以信任。我们可以给他设置一点权限让他能够运行但是又不会对我们的计算机造成破坏。

最新的沙箱安全机制引进了域(domain)。虚拟机会将不同的代码加载到不同的域上,不同的域有不一样的权限。

  • 组成部分
  • 字节校验码:确保java编码符合规范。但核心类代码不会经过校验。

  • 类加载器:在3个方面对沙箱起作用

    • 防止恶意代码去替换干扰系统类 双亲委派机制
    • 划定了界线
    • 将代码