java类加载过程详解,java类加载过程面试题

  java类加载过程详解,java类加载过程面试题

  如何解决写爬虫IP受阻的问题?立即使用。

  Java类加载过程

  首先是加载过程,即Java将不同数据源的字节码数据读入JVM,并映射到JVM认可的数据结构(类对象)。这里的数据源可能是各种形式的,比如jar文件、类文件,甚至网络数据源。如果输入数据不是ClassFile的结构,将抛出ClassFormatError。加载阶段是用户参与的阶段。我们可以定制类加载器来实现我们自己的类加载过程。

  第二阶段是链接,这是最核心的一步。简单来说,就是把原来的类定义信息平滑地转移到JVM的运行过程中。它可以进一步细分为三个步骤:1。验证,这是虚拟机安全的重要保障。JVM需要验证字节信息符合Java虚拟机规范,否则会被认为是VerifyError,从而防止恶意信息或不符合规范的信息危害JVM的运行。验证阶段可以触发更多类的加载。2、prepare (Pereparation),在类或接口中创建一个静态变量,并初始化静态变量的初始值。但是,这里的“初始化”不同于下面显示的初始化阶段。重点是分配所需的内存空间,不再执行JVM指令。3.分辨率。在这一步中,常量池中的符号引用将被直接引用替换。在Java虚拟机的规范中,详细介绍了对类、接口、方法和字段的分析。

  最后是初始化阶段,真正执行类初始化的代码逻辑,包括静态字段赋值的动作和类定义中静态初始化块中的逻辑。编译器会在编译阶段把这部分逻辑整理出来,父类型的初始化逻辑优先于当前类型的逻辑。先说家长委托模式。简单来说,当一个类加载器试图加载某个类型时,除非父类加载器找不到对应的类型,否则尽量把这个任务委托给当前加载器的父加载器。使用委托模型的目的是避免重复加载Java类型。

  自定义类加载器的常见场景

  与进程内隔离类似,类加载器实际上充当不同的名称空间,并提供类似容器和模块化的效果。举个例子:1、两个模块依赖于一个类库的不同版本,所以如果用不同的容器加载,是不能互相干扰的。这方面的高手是Jave EE,OSGL,JPMS等框架。2.应用程序需要从不同的数据源获取类定义信息,例如网络数据源而不是本地文件系统。3,或者你需要自己操纵字节码,动态修改生成类型。

  我们一般可以简单理解自定义类加载过程:1。通过指定名称,可以找到它的二进制实现,这往往是自定义类加载器会“自定义”的部分,比如根据名称从特定数据源获取字节码,或者修改或生成字节码。2.然后,创建类对象并完成类加载过程。二进制信息到类对象的转换通常依赖于defineClass,我们不需要自己实现。这是最后的方法。有了类对象,后续的加载过程就会顺利完成。

  推荐教程:以上《Java教程》是Java类加载过程的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: