我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Java系列】Java虚拟机—类加载器介绍

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Java系列】Java虚拟机—类加载器介绍

什么是Java虚拟机 

Java虚拟机(Java Virtual Machine,JVM)是一个能够执行 Java 字节码的虚拟计算机。它是 Java 技术的核心部分,是 Java 应用程序运行的基础。

Java 程序在编译后会生成字节码(bytecode),这种字节码是一种中间代码,它不依赖于具体的操作系统和硬件平台。

JVM 就是在特定的操作系统和硬件平台上执行这种字节码的虚拟计算机。

JVM 负责解释和执行 Java 字节码,还提供了垃圾回收、内存管理、安全检查等功能,使得 Java 程序具有跨平台的特性。

Java 字节码介绍

Java字节码是一种中间代码,是Java程序编译后的产物,它并不是机器码,而是一种与平台无关的二进制码。Java字节码可以被JVM所解释和执行,JVM会将字节码转化为机器码并执行。

Java字节码是由Java源代码编译而来,经过Java编译器编译后,生成相应的.class文件,其中包含了Java字节码。

Java字节码采用的是一种栈式架构,在执行时,操作数和指令都是基于栈操作的,这与基于寄存器的机器码有所不同。

Java字节码具有与平台无关的特性,这是因为Java虚拟机的存在,它可以在不同的平台上执行Java字节码,而不需要修改代码。因此,Java字节码是Java语言实现跨平台的基础。

2 JVM子系统

Java虚拟机(Java Virtual Machine,JVM)是一个能够执行Java字节码的虚拟计算机。它是Java技术的核心部分,是Java应用程序运行的基础。

JVM主要由三个子系统组成:

  1. 类加载器
  2. 运行时数据区
  3. 执行引擎

今天主要介绍一下类加载器。

2.1 类加载器

类加载器是Java虚拟机(JVM)的一个重要组成部分,它的主要任务是将编译后的Java类文件加载到内存中,并转换为可以被JVM执行的代码。类加载器是实现Java语言跨平台的基础,也是Java程序运行的关键。

Java类加载器的主要任务是将编译后的Java类文件加载到JVM中,并将其转换为可以执行的形式。Java类加载器可以分为三个层次:

  • 引导类加载器
  • 扩展类加载器
  • 应用程序类加载器
  • 自定义类加载器

Java类加载器的种类

Java类加载器按照加载类的位置和方式可以分为以下几种:

引导类加载器

引导类加载器是JVM自带的类加载器,它负责加载JVM自带的核心类库,如java.lang包中的类等。

它是JVM的内置部分,在JVM启动时就已经存在。

扩展类加载器

扩展类加载器负责加载Java的扩展类库,如JAVA_HOME/lib/ext目录下的类库、JAVA_HOME/lib/ext目录下的类库。

它是由Java虚拟机实现的一个类加载器。

应用程序类加载器

系统类加载器也称为应用程序类加载器(Application ClassLoader),负责加载应用程序中的类库。

是JVM默认的类加载器。它是由Java虚拟机实现的一个类加载器。

自定义类加载器

自定义类加载器是Java程序员根据自身的需求自己实现的类加载器。Java虚拟机提供了ClassLoader类,程序员可以继承ClassLoader类,实现自己的类加载器。

Java类加载器的工作原理

Java类加载器的工作原理是按照“双亲委派”模型来实现的。当一个类需要被加载时,首先会委托给父类加载器进行加载,如果父类加载器无法加载该类,则会依次向上委托给其父类加载器,直到到达引导类加载器,如果引导类加载器也无法加载该类,则会委托给自定义类加载器来进行加载。

双亲委派模型可以保证类的唯一性和安全性,避免重复加载和恶意篡改。

例如,如果一个应用程序中已经有了一个java.lang.String类,如果再次尝试加载java.lang.String类,就会委托给系统类加载器进行加载,而不是重新定义一个类。

Java类加载器的优化

Java类加载器的性能优化可以从以下几个方面入手:

  • 缓存机制
  • 类的预加载
  • Class文件的优化
缓存机制

Java类加载器在加载类时会进行缓存,可以通过设置缓存大小和缓存策略来优化类加载器的性能。

类的预加载

可以通过在程序启动时预加载一些常用的类,减少类加载器的工作量,提高程序的启动速度。

Class文件的优化

可以通过优化Class文件中的代码结构和字节码格式,减少类加载器的解析和转换时间,提高类的加载速度。

总结

Java类加载器是Java虚拟机的一个重要组成部分,它负责将编译后的Java类文件加载到内存中,并转换为可以被JVM执行的代码。

Java类加载器按照加载类的位置和方式可以分为引导类加载器、扩展类加载器、系统类加载器和自定义类加载器。

Java类加载器的工作原理是按照“双亲委派”模型来实现的。Java类加载器的性能优化可以从缓存机制、类的预加载和Class文件的优化等方面入手。

3 案例

Java类加载器的优化可以通过自定义类加载器来实现。下面是一个简单的自定义类加载器示例,用于从指定路径加载类文件:

import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class CustomClassLoader extends ClassLoader {    private String path;    public CustomClassLoader(String path) {        this.path = path;    }    @Override    protected Class findClass(String name) throws ClassNotFoundException {        byte[] classData = getClassData(name);        if (classData == null) {            throw new ClassNotFoundException();        } else {            return defineClass(name, classData, 0, classData.length);        }    }    private byte[] getClassData(String className) {        String classPath = path + File.separatorChar + className.replace('.', File.separatorChar) + ".class";        FileInputStream fis = null;        ByteArrayOutputStream bos = null;        try {            fis = new FileInputStream(classPath);            bos = new ByteArrayOutputStream();            byte[] buffer = new byte[1024];            int len;            while ((len = fis.read(buffer)) != -1) {                bos.write(buffer, 0, len);            }            return bos.toByteArray();        } catch (IOException e) {            e.printStackTrace();            return null;        } finally {            try {                if (fis != null) {                    fis.close();                }                if (bos != null) {                    bos.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}

在实际应用中,可以通过自定义类加载器来实现以下优化:

  1. 提高安全性:通过自定义类加载器,可以实现类的动态加载和卸载,从而提高应用程序的安全性。

  2. 实现热部署:通过自定义类加载器,可以实现类的热部署,从而提高应用程序的可维护性和可扩展性。

  3. 实现插件化:通过自定义类加载器,可以实现插件化的功能,从而使应用程序的功能更加灵活和可配置。

总之,自定义类加载器是Java类加载器优化的一个重要手段,可以实现很多有用的功能,提高应用程序的性能、安全性和可维护性。

图书推荐

图书名称:《深入浅出Java虚拟机:JVM原理与实战》

 

Java虚拟机核心技术一本通:通过实战案例+执行效果图+核心代码,剖析探索JVM核心底

原理,强化推动JVM优化落地,手把手教你吃透Java虚拟机深层原理!

编辑推荐

系统:全书内容层层递进,深入浅出,手把手教你吃透JVM虚拟机核心技术

深入:剖析探索JVM核心底层原理,强化推动JVM优化落地

原理与实践相结合,懂理论,能落地,实战化案例精准定位技术细节

资源:附赠全书案例源代码,知其然更知其所以然,快速上手不用愁

内容简介

本书主要以 Java 虚拟机的基本特性及运行原理为中心,深入浅出地分析 JVM 的组成结构和底层实现,介绍了很多性能调优的方案和工具的使用方法。最后还扩展介绍了 JMM 内存模型的实现原理和 Java 编译器的优化机制,让读者不仅可以学习 JVM 的核心技术知识,还能夯实 JVM 调优及代码优化的技术功底。

本书适合已具有一定 Java 编程基础的开发人员、项目经理、架构师及性能调优工程师参考阅读,同时,本书还可以作为广大职业院校、计算机培训班相关专业的教学参考用书。

先睹为快:深入解析Java虚拟机

参与方式

图书数量:本次送出 3 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-07-10 12:00:00

抽奖方式:

  • 在新星计划【云原生之k8s入门】方向参加的小伙伴中随机抽取

参与方式:

  • 关注博主、点赞、收藏,参与活动
  • 参加新星计划【云原生之k8s入门】,并提交任务。
  • 1. 点赞、收藏本文章
  • 2. 参与活动链接:活动详情

中奖名单 

🍓🍓 公布时间🍓🍓

 中奖名单:请关注博主动态

名单公布时间:2023-07-10 下午

🍓🍓 获奖名单🍓🍓

来源地址:https://blog.csdn.net/weixin_36755535/article/details/131539388

免责声明:

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

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

【Java系列】Java虚拟机—类加载器介绍

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JAVA虚拟机(JVM)详细介绍(五)——类加载机制

上篇中我们讲解了Class文件,这篇我们说说虚拟机是如何加载这些Class文件的?Class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚
JAVA虚拟机(JVM)详细介绍(五)——类加载机制
2015-12-28

java类加载机制详细介绍

文章转载自:http://www.pythonheidong.com/blog/article/1152/在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:class Grandpa{ static {
java类加载机制详细介绍
2019-02-20

Java 类加载机制详细介绍

一、类加载器  类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加
2023-05-31

Java类加载过程与类加载器详细介绍

这篇文章主要介绍了Java类加载过程与类加载器详细介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
2022-11-13

Java虚拟机之类加载的示例分析

小编给大家分享一下Java虚拟机之类加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序
2023-06-15

JAVA虚拟机(JVM)详细介绍(四)——类文件结构

讲完了自动内存管理,我们来说说执行子系统。执行子系统讲解的是JVM如何执行程序。Class文件概述这篇我们只讲讲Class文件。Class文件又名类文件或字节码文件。javac将.java文件(源代码)编译成.class文件(字节码),jvm再将.class文
JAVA虚拟机(JVM)详细介绍(四)——类文件结构
2016-02-29

JAVA虚拟机(JVM)详细介绍(七)——JVM优化

还以这个图为例,从.java到.class是编译过程,从.class到机器码是解释过程。下面对其进行分别优化。在优化过程中,对编译阶段的优化主要是对前端编译器的优化,在运行阶段的优化,主要是对即时编译器的优化。编译器优化编译过程以上为javac的编译过程图,以
JAVA虚拟机(JVM)详细介绍(七)——JVM优化
2017-09-20

JAVA虚拟机(JVM)详细介绍(一)——JVM概述

首先,对以上的四部分进行解释。(1)自动内存管理讲的是java运行时数据区里的部分,分为内存划分和垃圾收集器。(2)执行子系统讲的是画红圈的三部分:类文件结构、类加载机制、字节码执行引擎。(3)优化分别为编译期优化和运行期优化。(4)并发讲的是虚拟机是如何实现
JAVA虚拟机(JVM)详细介绍(一)——JVM概述
2016-06-30

JAVA虚拟机(JVM)详细介绍(八)——高效并发

内存模型内存模型是在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。其主要目标是定义程序中各个变量的访问规则。主内存和工作内存所有的变量都存储在主内存中,每条线程还有自己的工作内存,其工作内存中是被线程使用到的变量的主内存副本拷贝,线程对变量的
JAVA虚拟机(JVM)详细介绍(八)——高效并发
2017-08-31

如何深入理解Java虚拟机JVM类加载初始化

如何深入理解Java虚拟机JVM类加载初始化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. Classloader的作用,概括来说就是将编译后的class装
2023-06-17

JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制

在上一篇中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。在本部分我们要解决如下几个问题:1、哪些内存需要回收
JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制
2017-01-27

Java虚拟机类装载:原理、实现与应用

Java虚拟机类装载:原理、实现与应用[@more@]  一、引言   Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程。JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统
2023-06-03

Java高级之虚拟机加载机制的示例分析

这篇文章给大家分享的是有关Java高级之虚拟机加载机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Jvm要加载的是二进制流,可以是.class文件形式,也可以是其他形式,按照它加载的标准来设计就不会有
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录