【JVM】【类加载器】【总结】

概念

  1. 加载class文件的字节内容,转换为虚拟机可识别的内容;
  2. 类的加载是动态的,即在运行时需要的时候才会被加载;
  3. 对于hotshot虚拟机,加载class文件字节流到方法区,同时在方法去创建一个class对象,这个对象作为类对象访问的入口;
  4. 类唯一性:同一个类只有被同一个类加载器加载了,这两个类才算相等;每一个类加载器,都有一个独立的类名称空间,彼此相互隔离,互补干涉;
  5. 当加载器需要加载一个类时候,先看自己类名称空间是否有该class对象,如果没有则加载,否则不会再加载;因此,如果不同的几个类加载器,去加载同一份CLASS文件,那么每个类加载器空间都有一份这样的class文件;
  6. 类加载器具体内容如双亲委派机制等都是在ClassLoader里面具体实现的。例如loadclass函数里面就是双亲委培具体实现,findclass实在loaderclass无法加载到时候在执行此函数。因此,我们如果想破坏双亲委派就可以重写loadclass函数。总之,只要在loaderclass里面返回class对象就可以。可以查看自己GitHub的codedemo关于加载器实现。

用途

实现原理:两相同

同一个类若被同一个类加载器加载过,则不加载,反之加载;因此,可使同一个类被多个不同加载器类实现各种扩展;

案例

  1. 功能测试:若业务系统对同一个功能开发多个版本jar文件,此时并行测试,可用多个不同类加载器去加载不同版本的jar(虽然里面的类名称、包名全部相同),然后利用反射,这样很容易的实现同一个类文件不同版本的并行测试;
  2. OSGI:eclipse插件就是给予这样实现。不同模块叫做bundle,每个bundler都有自己唯一的类加载器,彼此相互隔离;目前使用的较少。关于OSGI可以参考OSGI文章
  3. 热部署:不停止服务,动态替换目标文件。实现原理是,实时监控某一目标类文件,当文件发生修改的时候,新创建一个类加载器去加载他即可。虽然之前这个类已经被加载运行,如果此时用上次的类加载器去加载变化的类,因为,符合“两相同”原则,那么JVM就认为类已经被加载过了,就不会再去加载了,因此,创建新的类加载器对象,此时类空间内容是空的,就可以重新去加载这个类文件;从而实现热部署的功能;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JVM(Java Virtual Machine)是Java程序的执行环境。当你运行一个Java程序时,它首先被编译成字节码,然后JVM将字节码解释成机器码并执行。 JVM加载过程可以分为以下几个步骤: 1. 加载(Loading):加载指的是将.class文件读入内存,并为之创建一个java.lang.Class对象。类加载器会负责从文件系统、JAR文件或网络中加载的字节码数据。 2. 链接(Linking):链接分为三个阶段,分别是验证(Verification)、准备(Preparation)和解析(Resolution)。 * 验证:验证字节码是否符合JVM规范,并且不会危害JVM的安全。如果验证失败,则会抛出java.lang.VerifyError异常。 * 准备:为的静态变量分配内存,并将其初始化为默认值(0、null等)。 * 解析:将、接口、字段和方法的符号引用解析为实际引用。这个过程可能需要在运行时进行。 3. 初始化(Initialization):在加载过程中,初始化是最后一步。在这个阶段,静态变量被初始化,静态块被执行。如果初始化一个时发生异常,则会抛出java.lang.ExceptionInInitializerError异常。 JVM类加载器有以下几种: 1. 启动类加载器(Bootstrap ClassLoader):它是最顶层的类加载器,负责加载JVM的核心库,如java.lang和java.util等。 2. 扩展类加载器(Extension ClassLoader):它加载Java平台扩展库的。默认情况下,它从$JAVA_HOME/jre/lib/ext目录加载。 3. 系统类加载器(System ClassLoader):也称应用程序类加载器,它加载应用程序路径上的。 4. 用户自定义类加载器:开发人员可以继承java.lang.ClassLoader,以实现自己的类加载器。 总之,JVM加载过程是Java程序运行的重要部分,它可以确保Java程序的正确执行。 ### 回答2: JVM(Java虚拟机)加载过程,是指JVM将字节码文件加载到内存,并转化为可以被JVM执行的可执行代码的过程。其中,解析是加载过程的一个重要步骤。 解析是JVM或接口的常量池中的符号引用进行直接引用的过程。在解析阶段,JVM将符号引用转换成直接引用,使得或接口可以直接被调用和执行。解析包括以下几个步骤: 1. 或接口的符号引用:在或接口的常量池中,使用符号引用表示对其他或接口的引用,符号引用包括的全限定名、方法的签名以及字段的描述符等。 2. 或接口的符号解析:JVM将符号引用转换成直接引用的过程。直接引用是一个指向、方法、字段在内存中的地址,JVM可以根据直接引用直接访问、方法或字段。 3. 的初始化:在的解析过程中,JVM还会执行的初始化。的初始化包括为静态变量赋值、执行静态代码块等。的初始化是在解析过程的最后阶段执行的,确保在被解析之后可以正常执行。 需要注意的是,或接口的解析并不一定发生在加载过程的一开始,JVM会根据需要进行解析。同时,在解析过程中,如果发生了符号引用无法解析的错误,JVM会抛出NoClassDefFoundError异常。 总之,JVM加载过程中的解析是将或接口的符号引用转换成直接引用的过程,使得程序可以直接访问和执行、方法以及字段。解析是加载过程的关键步骤之一,保证了的正确加载和正常执行。 ### 回答3: JVM加载过程包括:加载、验证、准备、解析和初始化五个阶段。其中,解析是指将常量池中的符号引用替换为直接引用的过程。 1. 加载阶段:JVM通过类加载器将字节码文件加载到内存中。加载阶段包括三个步骤:通过的全限定名找到定义的二进制数据文件,将二进制数据读入内存并创建一个Class对象,并在内存中生成一个代表该的Class对象。 2. 验证阶段:JVM对字节码进行验证,确保字节码文件符合JVM规范,并且没有安全方面的问题,如是否包含不合法或危险的代码。 3. 准备阶段:JVM的静态字段分配内存并设置默认初始值。这些值保存在方法区的静态变量区域中,方法区是JVM中的一块内存区域,用于存储的结构信息。 4. 解析阶段:在解析阶段,JVM、接口、字段和方法的符号引用替换为直接引用。符号引用是一组描述被引用的目标的符号,而直接引用是直接指向目标的指针、句柄或偏移量。在解析阶段,JVM将符号引用转换为直接引用,以便后续的执行中可以直接访问到目标。 5. 初始化阶段:在初始化阶段,JVM会对的静态变量赋予正确的初始值,并执行静态代码块。静态代码块中的代码主要用于初始化的静态变量和执行静态初始化块。只有在这个阶段,的实例才会被真正地创建。 总结来说,JVM加载过程中,解析阶段的主要目的是将常量池中的符号引用转换为直接引用,以便后续的执行中可以直接访问到目标。这个过程在加载的第三个阶段准备之后进行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值