JVM初识-java类加载器

  • 前言
    作为一位java开发人员,不懂java虚拟机规范是会被人鄙视的,特别是工作了多年的程序人员。为了不让他人有鄙视的机会,于是本人开始了JVM的学习之旅。
    学习Java虚拟机,从了解JVM内存模型开始。
  • JVM【java虚拟机规范】内存模型图


    1. Class files
    一般而言,我们都会将逻辑代码编写在以.java为后缀的文件中。class文件则是由java文件编译【使用javac命令编译】而成。

  • 2. 类加载器子系统

    class文件已经有了,那么class文件又是如何加载进虚拟机的呢?这时不得不提一下类加载器。类加载器,顾名思义,就是实现对类的加载-类加载器的主要任务就是将class文件加载进虚拟机内存。 从JAVA虚拟机的角度来看,类加载器可分为两种,一种是启动类加载器,用于加载虚拟机运行时所需类库。另一种是其他类加载器,用于加载非启动类库的其他所有类库。 从java开发人员的角度来看,类加载器还可以做更细致的划分,可分为:启用类加载器、扩展类加载器、应用程序类加载器及自动类加载器。如下图:

    • 启用类加载器(Bootstrap)C++
      负责将存在于<JAVA_HOME>\lib目录中的rt.jar的类库加载进虚拟机内存中
    • 扩展类加载器(Extension)Java
      负责将存在于<JAVA_HOME>\lib\ext目录中的所有类库加载进虚拟机内存中
    • 应用程序类加载器(AppClassLoader)java
      负责将用户类路径(ClassPath)上所指定的类库加载进虚拟机内存中
    • 自定义类加载器
      如开发人员对类的加载有特殊的要求,可自定义类加载器
      该类加载器子系统图展示了类加载器的种类,同时描述了类加载器之间的层次关系,我们称这种层次关系为双亲委派模型。
    • 双亲委派模型
      当类加载器收到类的加载请求时,首先自身不尝试去加载这个类,而是将这个类请求委派给父类加载器去完成。每个类加载 器都如此。因此所有的类加载请求都会传递到顶级类加载器【启动类加载器】,只有当父类加载器无法完成类加载请求时,子类加载器才会尝试自己去加载。
      如当类加载器加载java.lang.String类时。首先应用程序类加载器会接收到java.lang.String类的加载请求,因为应用序类加载器有父类加载器,所以应用程序类加载器不会尝试去加载java.lang.String类,而是将加载java.lang.String类的请求传递给父类加载器【扩展类加载器】。又因为扩展类加载器也有父类加载器【启用类加载器】,所以扩展类加载器也不去加载java.lang.String类,而是将加载java.lang.String类的请求传递给父类加载器【启动类加载器】。启动类加载器是顶级加载器,无父类加载器。它将尝试去加载java.lang.String类,刚好在rt.jar中找到了java.lang.String类,于是将该类加载进虚拟机。如果要加载的类并不在rt.jar里时。启动类加载器无法处理类请求,则会将类的加载请求下放子类加载器去处理。 如下图:

      类加载器内部是如何实现类加载的?这时候就要介绍一下类的加载过程。 类的加载时机分5步:加载、连接【验证、准备、解析】、初始化、使用、与卸载。其中加载、验证、准备、解析、初始化为类的加载全过程。如下图:

      • 加载

        • 通过一个类的全限定名获取定义该类的二进制字节流并在虚拟机中分配相应的内存
      • 连接【验证、准备、解析】
        • 验证:验证加载的类信息是否符合JVM标准,以确保虚拟机的安全
        • 准备:为类变量分配内存,并设置初始值
        • 解析:将虚拟机常量池中的符号引用转化为直接引用
      • 初始化
        • 执行类构造器

    原文地址:https://blog.51cto.com/14207809/2396879

    时间: 2024-10-14 19:47:18

    JVM初识-java类加载器的相关文章

    Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用2

    1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用. findClass protected Class<?> findClass(String name) throws ClassNotFoundException 使用指定的二进制名称查找类.此方法应该被类加载器的实现重写,该实现按照委托模型来加载类.在通过父

    Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器(System) 2.用户自定义的类加载器: java.lang.ClassLoader的子类,用户可以定制类的加载方式. JVM自带的加载器 Java虚拟机自带了以下几种加载器. 1.根(Bootstrap)类加载器: 该加载器没有父加载器. 它

    Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用

    1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用. findClass protected Class<?> findClass(String name) throws ClassNotFoundException 使用指定的二进制名称查找类.此方法应该被类加载器的实现重写,该实现按照委托模型来加载类.在通过父

    Java类加载器的工作原理

    Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它.可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类 加载器加载的类.单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类.正确理解类加载器能够帮你解决 NoClassDefFoundError和java.lang.ClassNo

    java类加载器——ClassLoader

    Java的设计初衷是主要面向嵌入式领域,对于自定义的一些类,考虑使用依需求加载原则,即在程序使用到时才加载类,节省内存消耗,这时即可通过类加载器来动态加载. 如果你平时只是做web开发,那应该很少会跟类加载器打交道,但如果你想深入学习tomcat服务器的架构,它是必不可少的.所谓类加载器,就是用于加载Java类到Java虚拟机中,它负责读取Java字节码,并转换成java.lang.Class类的一个实例,使字节代码.class文件得以运行.一般类加载器负责根据一个指定的类找到对应的字节代码,然

    一篇文章读懂Java类加载器

    Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上一搜一大片,我自己也看过很多文档,博客.资料虽然很多,但还是希望通过本文尽量写出一些自己的理解,自己的东西.如果只是重复别人写的内容那就失去写作的意义了. 类加载器结构 名称解释: 根类加载器,也叫引导类加载器.启动类加载器.由于它不属于Java类库,这里就不说它对应的类名了,很多人喜欢称Boots

    java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制.JVM中用来完成上述功能的具体实现就是类加载器.类加载器读取.class字节码文件将其转换成java.lang.Class类的一个实例.每个实例用来表示一个java类.通过该实例的newInstance()方法可以创建出一个该类的对象. 类的生命周期: 类从加载到虚拟机内存到被从内存中释放,经历的

    Java类加载器工作原理

    Java类加载器是用来在运行时加载类(*.class文件).Java类加载器基于三个原则:委托.可见性.唯一性.委托原则把加载类的请求转发给父 类加载器,而且仅加载类当父 类加载器无法找到或者不能加载类时.可见性原则允许子类加载器查看由父类加载器加载的所有的类,但是父类加载器不能查看由子类加载器加载的类.唯一性原则只允许加载一次类文件,这基本上是通过委托原则来实现的并确保子类加载器不重新加载由父类加载器加载过的类.正确的理解类加载器原理必须解决像 NoClassDefFoundError in

    浅析java类加载器ClassLoader

    作为一枚java猿,了解类加载器是有必要的,无论是针对面试还是自我学习. 本文从JDK提供的ClassLoader.委托模型以及如何编写自定义的ClassLoader三方面对ClassLoader做一个简要的总结. JDK中提供的ClassLoader 1. Bootstrap ClassLoader Bootstrap加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类,是最顶