java类加载机制

关于类加载器子系统

声明:文章是原创的,图是偷来的,文章段落也有在网上借鉴。如有侵权,联系我。

关于类加载子系统,带着几个问题去写了(抄袭)这篇文章。

  • 1.类加载器是什么,是干嘛的?
  • 2.类加载器加载的是什么?
  • 3.类加载器有几种?
  • 4.类加载器的加载顺序?
  • …后序学完虚拟机之后,会对文章进行补充完整。有说(抄)的不对的地方,你商标管我。

1.内存结构的概述

1.1虚拟机的整体结构

思考:虚拟机性能高的原因是什么?

  • 1.HotSpot JVM是目前市面上高性能虚拟机之一。(只是之一,还有其他的哦)
  • 2.它采用的是解释器即时编译器并存的架构。
  • 3.在今天,JVM的性能十分🐮🍺!已经达到了和C/C++能平起平坐的地步。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHkMSf0z-1612197634005)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\05e32da21f7e001e26951a21a6393db5.png)]

1.2虚拟机详细图

  • 1.这篇文章主要说的是类加载,就是黄图的部分。😍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QV3gyLoD-1612197634006)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\94f3ef5322aa4dd32f2478f49c98a7af.png)]

假如自己写个虚拟机的话,要考虑哪些结构?

  • 类加载器(class loader)
  • 执行引擎 (execution engine)

2.1类加载子系统

关于类加载子系统的几个问题

  • 1.类加载系统的作用
  • 2.jvm中相同的类的定义是什么

2.1.1类加载子系统的作用

  • 1.类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。

  • 2.ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行殷勤)决定。

  • 3.加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)

    • ==常量池:==在运行时加载到内存里,就叫做运行时常量池

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mbud8p1o-1612197634007)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\o_200625125306批注 2020-06-25 205256.png)]

2.2关于类加载器ClassLoader角色(★★★★)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VGHy54Re-1612197634009)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doLzEzOTI1MTcxMzgvaW1nUmVwb3NpdG9yeUBtYXN0ZXIvaW1hZ2UtMjAyMDA0MzAxNTMzMzk1NTIucG5n)]

从class文件到对象创建的过程

  • 1.编译后到Car class文件放在硬盘上
  • 2.物理磁盘中的文件通过二进制流的方式加载到内存
  • 3.通过类加载器存放在方法区中(即DNA元数据模版)
  • 4.通过getClassLoader()获取是谁加载的这个类(即获得了这个类的类加载器)
  • 5.在内存当中调用这个Car 这个class的类构造器就可以在堆中创建几个对象
  • 6.针对具体的对象也可调用getClass可以获取类本身(即你是由哪个类所创建的对象)

2.2.1关于ClassLoader提供的六个关键方法(了解)

  • 1.loadClass
此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从parentClassLoader中寻找,如仍然没找到,则从System ClassLoader中寻找,最后再调用findClass方法来寻找,如果要改变类的加载顺序,则可覆盖此方法。
  • 2.findLoadedClass
此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。
  • 3.findClass
此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。
  • 4.findSystemClass
  此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找,如仍然未找到,则返回null。
  • 5.defineClass
  此方法负责将二进制的字节码转换为Class对象。
  • 6.resolveClass
 此方法负责完成Class对象的链接,如已链接过,则会直接返回。

2.3类的加载过程

示例代码

 public static void main(String[] args) {
        System.out.println("谢谢ClassLoader加载我....");
        System.out.println("你的大恩大德,我下辈子再报!");
    }

args) {
System.out.println(“谢谢ClassLoader加载我…”);
System.out.println(“你的大恩大德,我下辈子再报!”);
}


> **加载过程**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值