JVM类加载机制详解

1、类加载器的定义

Java类加载器是用户程序和JVM虚拟机之间的桥梁,.java通过javac编译成.class,jvm只能识别.class文件,再由类加载器在jvm运行时将.class转化成 java.lang.Class 类的一个实例

2、类加载器的运行原理

程序在启动时,不会一次性加载所有的.class文件,而是通过类加载器动态加载需要的.class,只有加载到内存中的class文件才能被其他类引用。JVM运行首先会加载初始类MainCalss,初始类引用到的类会一起加载到内存中,没有引用到的会在引用时动态加载。

注意 :static final 修饰的变量不会被加载,static final修饰的方法会被加载。

3、类加载器的意义

类加载器是 Java 的一个创新,它使得 Java 类可以被动态加载到 Java 虚拟机中并执行,类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。

[图片上传失败...(image-950f1-1649064930562)]

4、 类加载的基本流程

[图片上传失败...(image-9e5718-1649064930562)]

1.加载:加载是通过类载器(ClassLoader)完成的,它既可以是饿汉式加载类(预加载),也可以是懒加载lazy load(运行时加载)

2.验证:确保.class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 验证阶段是否严谨,直接决定了Java虚拟机是否能承受恶意代码的攻击。 从整体上看,验证阶段大致上会完成下面四个阶段的检验动作:文件格式验证、元数据验证、字节码验证、符号引用验证。

3.准备:准备阶段的主要任务是如下两点:为类变量分配内存;设置类变量初始值。

4.解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

5.初始化:初始化阶段即虚拟机执行类构造器()方法的过程。

6.使用:正常使用类信息。

7.卸载:满足类卸载条件时(比较苛刻),jvm会从内存中卸载对应的类信息。

5、类加载器的特殊逻辑

双亲委派模型

java中的类加载默认是采用双亲委派模型,即加载一个类时,首先判断自身define加载器有没有加载过此类,如果加载了直接获取class对象,如果没有查到,则交给加载器的父类加载器去重复上面过程。

具体过程如下:

当一个类加载器接收到类加载任务时,先查缓存里有没有,如果没有,将任务委托给它的父加载器去执行。
父加载器也做同样的事情,一层一层往上委托,直到最顶层的启动类加载器为止。
如果启动类加载器没有找到所需加载的类,便将此加载任务退回给下一级类加载器去执行,而下一级的类加载器也做同样的事情。
如果最底层类加载器仍然没有找到所需要的class文件,则抛出异常

双亲委派模型的意义:

确保类的全局唯一性

如果用户自己编写了和java自己的类同名的类,在最顶层类加载器中准备加载时,类加载器在java核心库中先找到了同名类,然后终止加载,抛出异常。

从安全的角度讲,通过双亲委托机制,Java虚拟机总是先从最可信的Java核心API查找类型,可以防止不可信的类假扮被信任的类对系统造成污染。
 

6、类加载器与 Web 容器

对于运行在 Java EE™ 容器中的 Web 应用来说,类加载器的实现方式与一般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说,每个 Web 应用都有一个对应的类加载器实例。该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。

绝大多数情况下,Web 应用的开发人员不需要考虑与类加载器相关的细节。下面给出几条简单的原则:

每个 Web 应用自己的 Java 类文件和使用的库的 jar 包,分别放在 WEB-INF/classes 和 WEB-INF/lib 目录下面。
多个应用共享的 Java 类文件和 jar 包,分别放在 Web 容器指定的由所有 Web 应用共享的目录下面。
当出现找不到类的错误时,检查当前类的类加载器和当前线程的上下文类加载器是否正确。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值