返回顶部
首页 > 资讯 > 精选 >如何使用最新版JDK15的JVM类加载器
  • 276
分享到

如何使用最新版JDK15的JVM类加载器

2023-06-15 18:06:37 276人浏览 八月长安
摘要

这篇文章主要讲解了“如何使用最新版jdk15的JVM类加载器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用最新版JDK15的JVM类加载器”吧!1 类加载器在类加载器家族中存在着类似

这篇文章主要讲解了“如何使用最新版jdk15的JVM类加载器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用最新版JDK15的JVM类加载器”吧!

1 类加载器

在类加载器家族中存在着类似人类社会的权力等级制度:

1.1 Bootstrap

C/C++实现,启动类加载器,属最高层,JVM启动时创建,通常由与os相关的本地代码实现,是最根基的类加载器。

JDK8 时

需要注意的是,Bootstrap  ClassLoader智慧加载特定名称的类库,比如rt.jar.这意味我们自定义的jar扔到\jre\lib也不会被加载.

负责将/jre/lib或-  Xbootclasspath参数指定的路径中的,且是虚拟机识别的类库加载到内存中(按照名字识别,比如rt.jar,对于不能识别的文件不予装载),比如:

  • Object

  • System

  • String

  • Java运行时的rt.jar等jar包

  • 系统属性sun.boot.class.path指定的目录中特定名称的jar包

在JVM启动时,通过Bootstrap ClassLoader加载rt.jar,并初始化sun.misc.Launcher从而创建Extension  ClassLoader和Application ClassLoader的实例。

查看Bootstrap ClassLoader到底初始化了那些类库:

URL[] urLs = Launcher.getBootstrapClassPath().getURLs();        for (URL urL : urLs) {            System.out.println(urL.toExternalFORM());        }

JDK9 后

负责加载启动时的基础模块类,比如:

  • java.base

  • java.management

  • java.xml

1.2 Platform ClassLoader

JDK8 时Extension ClassLoader

只有一个实例,由sun.misc.Launcher$ExtClassLoader实现:

  • 负责加载

    \lib\ext或java.ext.dirs系统变量指定的路径中的所有类库
  • 加载一些扩展的系统类,比如XML、加密、压缩相关的功能类等

JDK9时替换为平台类加载器

加载一些平台相关的模块,比如java.scripting、java.compiler*、 java.corba*。

那为何 9 时废除替换了呢?

JDK8 的主要加载 jre lib 的ext,扩展 jar 包时使用,这样操作并不推荐,所以废除。而 JDK9  有了模块化,更无需这种扩展加载器。

1.3 Application ClassLoader

只有一个实例,由sun.misc.Launcher$AppClassLoader实现。

JDK8 时

负责加载系统环境变量ClassPath或者系统属性java.class.path指定目录下的所有类库。

如果应用程序中没有定义自己的加载器,则该加载器也就是默认的类加载器。该加载器可以通过java.lang.ClassLoader.getSystemClassLoader获取。

JDK9 后

应用程序类加载器,用于加载应用级别的模块,比如:

  • jdk.compiler

  • jdk.jartool

  • jdk.jshell

如何使用最新版JDK15的JVM类加载器
  • classpath路径中的所有类库

第二、三层类加载器为Java语言实现,用户也可以

1.4 自定义类加载器

用户自定义的加载器,是java.lang.ClassLoader的子类,用户可以定制类的加载方式;只不过自定义类加载器其加载的顺序是在所有系统类加载器的最后。

1.5 Thread Context ClassLoader

每个线程都有一个类加载器(jdk 1.2后引入),称之为Thread Context  ClassLoader,如果线程创建时没有设置,则默认从父线程中继承一个,如果在应用全局内都没有设置,则所有Thread Context  ClassLoader为Application  ClassLoader.可通过Thread.currentThread().setContextClassLoader(ClassLoader)来设置,通过Thread.currentThread().getContextClassLoader()来获取.

线程上下文加载器有什么用?

该类加载器容许父类加载器通过子类加载器加载所需要的类库,也就是打破了我们下文所说的双亲委派模型。

这有什么好处呢?

利用线程上下文加载器,我们能够实现所有的代码热替换,热部署,Android中的热更新原理也是借鉴如此。

2 验证类加载器

2.1 查看本地类加载器

如何使用最新版JDK15的JVM类加载器

在JDK8环境中,执行结果如下

如何使用最新版JDK15的JVM类加载器

AppClassLoader的Parent为Bootstrap,它是通过C/c++实现的,并不存在于JVM体系内,所以输出为 null。

类加载器的特点

  • 类加载器并不需要等到某个类"首次主动使用”的时候才加载它,JVM规范允许类加载器在预料到某个类将要被使用的时候就预先加载它

  • Java程序不能直接引用启动类加载器,直接设置classLoader为null,默认就使用启动类加载器

  • 如果在加载的时候.class文件缺失,会在该类首次主动使用时通知LinkageError错误,如果一直没有被使用,就不会报错

  • 如果没有指定父加载器,默认就是启动加载器

  • 每个类加载器都有自己的命名空间,命名空间由该加载器及其所有父加载器所加载的类构成。不同的命名空间,可以出现类的全路径名相同的情况

  • 运行时包由同一个类加载器的类构成,决定两个类是否属于同一个运行时包,不仅要看全路径名是否一样,还要看定义类加载器是否相同。只有属于同一个运行时包的类才能实现相互包内可见

如何使用最新版JDK15的JVM类加载器

低层次的当前类加载器,不能覆盖更高层次类加载器已经加载的类

如果低层次的类加载器想加载一个未知类,要非常礼貌地向上逐级询问:“请问,这个类已经加载了吗?”

被询问的高层次类加载器会自问两个问题

  • 我是否已加载过此类

  • 如果没有,是否可以加载此类

只有当所有高层次类加载器在两个问题的答案均为“否”时,才可以让当前类加载器加载这个未知类

左侧绿色箭头向上逐级询问是否已加载此类,直至Bootstrap  ClassLoader,然后向下逐级尝试是否能够加载此类,如果都加载不了,则通知发起加载请求的当前类加载器,准予加载

在右侧的三个小标签里,列举了此层类加载器主要加载的代表性类库,事实上不止于此

通过如下代码可以查看Bootstrap 所有已加载类库

如何使用最新版JDK15的JVM类加载器

执行结果

如何使用最新版JDK15的JVM类加载器

Bootstrap加载的路径可以追加,不建议修改或删除原有加载路径

在JVM中增加如下启动参数,则能通过Class.forName正常读取到指定类,说明此参数可以增加Bootstrap的类加载路径:

-Xbootclasspath/a:/Users/sss/book/ easycoding/byJdk11/src

如果想在启动时观察加载了哪个jar包中的哪个类,可以增加

-XX:+TraceClassLoading

此参数在解决类冲突时非常实用,毕竟不同的JVM环境对于加载类的顺序并非是一致的

有时想观察特定类的加载上下文,由于加载的类数量众多,调试时很难捕捉到指定类的加载过程,这时可以使用条件断点功能

比如,想查看HashMap的加载过程,在loadClass处打个断点,并且在condition框内输入如图

如何使用最新版JDK15的JVM类加载器

JVM如何确立每个类在JVM的唯一性

类的全限定名和加载这个类的类加载器的ID

在学习了类加载器的实现机制后,知道双亲委派模型并非强制模型,用户可以自定义类加载器,在什么情况下需要自定义类加载器呢?

  • 隔离加载类

         在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境

         比如,阿里内某容器框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包

  • 修改类加载方式

         类的加载模型并非强制,除Bootstrap外,其他的加载并非一定要引入,或者根据实际情况在某个时间点进行按需进行动态加载

  • 扩展加载源

         比如从数据库网络,甚至是电视机机顶盒进行加载

         Java代码容易被编译和篡改,可以进行编译加密。那么类加载器也需要自定义,还原加密的字节码。

实现自定义类加载器的步骤

  • 继承ClassLoader

  • 重写findClass()方法

  • 调用defineClass()方法

一个简单的类加载器实现的示例代码如下

如何使用最新版JDK15的JVM类加载器

由于中间件一般都有自己的依赖jar包,在同一个工程内引用多个框架时,往往被迫进行类的仲裁。按某种规则jar包的版本被统一指定,  导致某些类存在包路径、类名相同的情况,就会引起类冲突,导致应用程序出现异常。

主流的容器类框架都会自定义类加载器,实现不同中间件之间的类隔离,有效避免了类冲突。

感谢各位的阅读,以上就是“如何使用最新版JDK15的JVM类加载器”的内容了,经过本文的学习后,相信大家对如何使用最新版JDK15的JVM类加载器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何使用最新版JDK15的JVM类加载器

本文链接: https://lsjlt.com/news/281232.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用最新版JDK15的JVM类加载器
    这篇文章主要讲解了“如何使用最新版JDK15的JVM类加载器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用最新版JDK15的JVM类加载器”吧!1 类加载器在类加载器家族中存在着类似...
    99+
    2023-06-15
  • JVM类加载器之ClassLoader的使用详解
    目录类加载器概述加载器的种类验证不同加载器核心方法JVM类加载机制的三种方式全盘负责父类委托、双亲委派缓存机制打破双亲委派重写loadclass方法自定义类加载器准备字节码文件创建自...
    99+
    2022-11-13
    JVM类加载器ClassLoader JVM类加载器 类加载器ClassLoader
  • 如何在java中使用类加载器
    今天就跟大家聊聊有关如何在java中使用类加载器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3...
    99+
    2023-06-14
  • 如何下载并安装最新版本的 OPatch
    1、登陆mos站点下载最新版本的 OPatch补丁,这里以p6880880_102000_Linux-x86-64.zip补丁为例。https://updates.oracle.com/download/6...
    99+
    2024-04-02
  • 如何使用React Native构建类似Tinder的加载器
    这篇文章将为大家详细讲解有关如何使用React Native构建类似Tinder的加载器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。尝试描述在React Native中...
    99+
    2024-04-02
  • 如何在 ASP 中使用最新版本的 npm 包?
    在现代 Web 开发中,前端框架和库的使用已经成为了标配,而 npm 是其中最为常用的包管理工具。随着 npm 包的数量不断增加,不断有新的版本发布,我们需要确保我们的项目使用的是最新版本的包,以保证项目的质量和稳定性。本文将介绍如何在 ...
    99+
    2023-10-21
    npm 同步 实时
  • Java类加载器ClassLoader的使用详解
    目录BootstrapClassLoaderExtClassLoaderAppClassLoader类加载器的具体实现在哪里类加载器的初始化时机如何进行的类加载Loader.getR...
    99+
    2022-12-19
    Java类加载器ClassLoader Java ClassLoader Java类加载器
  • Ubuntu 17.10最新版如何使用动态工作区
    这篇文章主要介绍Ubuntu 17.10最新版如何使用动态工作区,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Ubuntu 17.10最新版中工作区默认采用动态模式,开机默认有两个工作区,随着在不同工作区上打开应用...
    99+
    2023-06-13
  • 如何使用纯css写出爱心版加载效果
    小编给大家分享一下如何使用纯css写出爱心版加载效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!爱心等待效果如下:现在互联网时代网站何其多,各有各得风格,但是什么样的风格能留住用户的停留...
    99+
    2024-04-02
  • 如何使用Go语言加载容器?
    Go语言是一种流行的编程语言,它具有高效、可靠和易于使用的特点。在容器化的世界中,Go语言也是非常流行的一种语言。在本文中,我们将探讨如何使用Go语言加载容器。 Docker是目前最流行的容器化工具之一。在Go语言中,有一个名为"dock...
    99+
    2023-09-18
    关键字 load 容器
  • 如何使用Python在Windows中加载不同类型的数据?
    Python是一种广泛使用的编程语言,它可以处理各种类型的数据。如果你需要在Windows中加载不同类型的数据,Python是一个非常好的选择。在本文中,我们将介绍如何使用Python在Windows中加载不同类型的数据。 加载CSV文...
    99+
    2023-08-31
    windows 数据类型 load
  • 如何在 Linux 上使用 Python 加载不同的数据类型?
    Python 是一种流行的编程语言,它具有高度的灵活性和可扩展性,使其成为数据科学和机器学习领域的首选语言。在 Linux 上使用 Python 可以加载不同的数据类型,包括文本、图像、音频和视频。本文将介绍如何使用 Python 在 L...
    99+
    2023-07-04
    linux 数据类型 load
  • 如何在你的项目中使用最新的数据类型框架?
    在现代软件开发中,数据类型是非常关键的一部分。在过去,程序员必须手动创建和管理数据类型,这往往会消耗大量的时间和精力。但是,现在有很多数据类型框架可以帮助我们更轻松地处理数据类型。在本文中,我们将介绍如何使用最新的数据类型框架来提高你的项目...
    99+
    2023-07-03
    数据类型 npm 框架
  • 如何在使用location.reload()重新加载后重定向页面
    您可以在重新加载页面后使用JavaScript的`window.location.href`方法来重定向页面。以下是一个示例代码:`...
    99+
    2023-08-18
    重定向
  • 如何在PHP中使用Laravel容器加载?
    PHP是一种非常流行的服务器端脚本语言,它的应用领域非常广泛,可以用于开发Web应用程序、命令行工具、桌面应用程序等等。而Laravel是一款流行的PHP框架,它提供了丰富的功能和工具,可以帮助开发者更加高效地开发Web应用程序。其中,La...
    99+
    2023-09-16
    load laravel 容器
  • 如何在Windows平台上使用Python加载数据类型?
    Python是一种流行的编程语言,它在数据科学和机器学习等领域得到了广泛的应用。在Windows平台上,Python有很多库可以用来加载不同的数据类型。本文将介绍如何在Windows平台上使用Python加载数据类型。 加载CSV文件 ...
    99+
    2023-08-31
    windows 数据类型 load
  • 如何使用ASP加载打包的Git?
    ASP是一种广泛使用的服务器端脚本语言,用于创建动态网站和Web应用程序。而Git是一个流行的分布式版本控制系统,用于管理软件开发项目。本文将介绍如何使用ASP加载打包的Git。 一、安装Git 首先,你需要在服务器上安装Git。你可以从G...
    99+
    2023-07-21
    load 打包 git
  • VSCode如何使用最新的C++20(推荐)
    先下载MSYS2 打开MSYS2的官网:https://www.msys2.org/ 下载完成后打开安装包,选择自己要安装的目录,一直下一步 安装完成后在浏览器打开MSYS2 P...
    99+
    2024-04-02
  • 新版Android Studio如何回退使用老版本的Logcat
    File -> Settings -> Experimental -> Logcat 取消勾选 Enable new Logcat tool window 即可,如图: 来源地址:https://blog.c...
    99+
    2023-08-18
    android studio android ide
  • 如何使用webpack配置react-hot-loader热加载局部更新
    这篇文章主要讲解了“如何使用webpack配置react-hot-loader热加载局部更新”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用webpack配置react-hot-loa...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作