文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JVM分析之类加载机制详解

2022-11-13 14:41

关注

1、前言

JVM内部架构包含类加载器、内存区域、执行引擎等。日常开发中,我们编写的java文件被编译成class文件后,jvm会进行加载并运行使用类。本次仅对JVM加载部分进行分析,了解并掌握加载机制。

2、类加载是什么

类加载是一种过程,是将class文件加载到jvm内存的过程。当代码逻辑中需要引用类时,通过类加载器加载引用类对象并存放堆中,以供代码调用。

3、类加载过程

注:类加载过程包含 加载、链接(验证、准备、解析)、初始化

3.1 加载

加载:将类的class字节码文件读到内存,将其存放到运行时数据区的方法区,然后在堆区生成class对象,封装类在方法区内的数据结构。(方法区-》数据结构,堆区-》class对象)

过程:java文件-》通过java c编译成字节码.class文件-》引导类加载器(装载核心类库)-》扩展类加载器(将指定目录jar包装载至工作库)-》系统类加载器(将指定目录的类和jar包装载至工作库,常用)-》自定义类加载器(实现加载指定类或自定义加密等操作)

缓存:类加载到jvm后,会缓存一段时间(不管是否被引用),待jvm执行垃圾回收时才会回收未使用的缓存类,释放空间。

类加载器:

类加载机制

加载实现方式

 
 ClassLoader classLoader = ClassSegregationTest.class.getClassLoader();
 classLoader.loadClass("com.lgy.example.class_segregation.SegregationTestA");
 // 默认初始化class对象
 Class.forName("com.lgy.example.class_segregation.SegregationTestA");
 // 默认不初始化,并且指定类加载器进行加载
 Class.forName("com.lgy.example.class_segregation.SegregationTestA", false, classLoader);

3.2 链接

链接是将java二进制代码合并至jvm运行的过程。

链接过程可分为 验证、准备、解析 三个阶段。

验证

保证正确加载类,包括文件格式验证(Class文件格式的规范)、元数据验证(Java语言规范)、字节码验证(通过数据流和控制流分析)、符号引用验证。

准备

解析

3.3 初始化

执行每个类的构造方法init()的过程,init()方法是java编译器自动收集、合并所有类变量的赋值动作和静态代码块语句,完成初始化。

初始化步骤

初始化条件(只有对类主动使用时才会初始化类)

演示代码如下:

 
 class Parent {
  public static int a = 10;
  static {
   System.out.println(" 父类初始化 ");
  }
 }
 class Children extends Parent{
  public static int a = 100;
  static {
   System.out.println(" 子类初始化 ");
  }
 }
 public static void main(String[] args) throws Exception {
  // 子类没有定义变量a ( public static int a = 100;)
    System.out.println(Children.a); // 输出 --  父类初始化 -- 10 
    // 主动调用时才会执行类的静态块
    -----------------------------------------
    // 子类定义变量a 
    System.out.println(Children.a); // 输出 -- 父类初始化 -- 子类初始化  -- 100 
  // 子类被初始化时,优先初始化父类,所以父类静态块执行;调用变量a属于子类定义,属于主动调用,所以子类静态块执行
 }

调试输出加载对象(VM options 中添加 -XX:+TraceClassLoading

仅在首次主动使用才会被初始化。

4、总结

以上就是关于自定义类加载器、加载过程的全部内容。

本文是针对于类隔离实现之自定义类加载器的扩展,对于应用中类加载阶段的进一步分析。

通过本文的分析可以了解到类加载过程及涉及到的jvm中的模块,在整理过程中发现有些细节还需要扩展,所以还尚未成功,还需持续跟进。

到此这篇关于JVM分析之类加载机制详解的文章就介绍到这了,更多相关JVM类加载机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯