详解jvm双亲委派机制

详解JVM双亲委派机制

前言

Java虚拟机(JVM)是一种能够执行Java字节码的虚拟机,它是Java平台的核心部分之一。在Java平台中,类的加载、验证、解析、初始化等操作都是由JVM来完成的。而JVM在执行这些操作时,会采用一种称为“双亲委派机制”的策略来保证Java程序的安全性和稳定性。下面,我们将详细讲解这种机制的实现原理和作用。

双亲委派机制的定义

双亲委派机制,顾名思义,是指当一个Java类使用其它类时,JVM会首先到父类加载器中查找被使用的类,如果父类加载器找到了该类,则直接返回其引用;如果父类加载器没有找到该类,则将该请求委派给子类加载器进行处理,如果子类加载器仍没有找到,则再将请求委派给父类加载器的父类加载器,依次递归,直到找到类为止,或者一直递归到Bootstrap ClassLoader(启动类加载器),如果最终仍然没有找到该类,则抛出ClassNotFoundException异常。

双亲委派机制的作用

双亲委派机制一方面保证了Java程序的稳定性和安全性,另一方面使得Java类库的重用成为可能。由于类的加载是由父类加载器完成的,因此同一个类在不同的类加载器中只会被加载一次,从而避免了类的重复加载,节省了内存空间。

双亲委派机制的实现原理

双亲委派机制的实现原理可以分为三个步骤:

  1. 当一个Java类需要被加载时,首先由当前线程的类加载器来查找该类是否已经被加载过了,如果已经加载过了,则直接返回其Class对象,如果没有加载过,则进行下一步。

  2. 调用父类加载器的loadClass()方法来尝试加载该类,如果父类加载器找到了该类,则直接返回其Class对象,如果父类加载器没有找到,则进行下一步。

  3. 调用Bootstrap ClassLoader(启动类加载器)的loadClass()方法来尝试加载该类,如果启动类加载器找到了该类,则直接返回其Class对象,如果启动类加载器没有找到该类,则抛出ClassNotFoundException异常。

示例说明

下面我们通过两个示例来说明双亲委派机制的应用和效果:

示例一:自定义ClassLoader

import java.io.IOException;
import java.io.InputStream;

public class MyClassLoader extends ClassLoader {
    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        if (name.startsWith("java.")) {
            return super.loadClass(name);
        }
        String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
        InputStream is = getClass().getResourceAsStream(fileName);
        if (is == null) {
            return super.loadClass(name);
        }
        try {
            byte[] bytes = new byte[is.available()];
            is.read(bytes);
            return defineClass(name, bytes, 0, bytes.length);
        } catch (IOException e) {
            throw new ClassNotFoundException(name);
        }
    }
}

MyClassLoader是一个自定义ClassLoader,它会优先使用父类加载器来加载类,如果父类加载器没有加载成功,则再使用自己来加载类。在本例中,如果要加载的类的类名以"java."开头,则直接使用父类加载器来加载;否则,会先尝试从当前类路径中查找该类的字节码文件,如果找不到,则使用父类加载器加载。这样就可以实现Java程序中的隔离和安全。如果在程序中使用MyClassLoader来加载文件,那么所有的类都是在MyClassLoader的范围内加载,从而可以避免Java程序中的不必要干扰。

示例二:单例模式

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Singleton是一个单例模式的实现,它只会创建一个实例并返回。在Java程序中,由于所有的类都是被启动类加载器Bootstrap ClassLoader所加载的,因此可以通过反射来破坏Singleton的单例性。但是,如果采用双亲委派机制,将Singleton的实现放到一个自定义的ClassLoader中,则可以保证Singleton的单例性不被破坏。这是因为,如果要破坏Singleton的单例性,则需要同样的类对象,而由于自定义ClassLoader和启动类加载器是互相独立的,它们不会加载同样的类,从而保证了Singleton的单例性不被破坏。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解jvm双亲委派机制 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • win7下docker环境安装

    Win7下Docker环境安装 前言 Docker是一个优秀的容器化技术,它可以让应用程序在不同的操作系统中运行,以及提供了强大的版本管理和便捷的部署流程。本文将介绍如何在Windows7系统下安装Docker环境。 安装Docker Toolbox 由于Docker在Windows7中不支持Hyper-V,因此我们需要使用Docker Toolbox。 首…

    其他 2023年3月28日
    00
  • sublimetext3

    以下是Sublime Text 3的完整攻略,包括两个示例说明。 步骤 以下是Sublime Text 3的基本步骤: 下载Sublime Text 。 从Sublime官网下载Sublime Text 3的安装包。 安装Sublime Text 3。 双击下载的安装包,按照安装向导安装。 安装Package Control。 在Sublime Text 3…

    other 2023年5月6日
    00
  • python修改FTP服务器上的文件名

    下面是Python修改FTP服务器上的文件名的完整攻略: 准备工作: 首先要确保Python安装好了,以及已经安装好了ftplib库,如果没有安装,可以在cmd命令行中执行pip install ftplib进行安装。 确定FTP服务器的地址、用户名和密码,并能够成功连接FTP服务器。 修改FTP服务器上的文件名: 连接FTP服务器 from ftplib …

    other 2023年6月26日
    00
  • ubuntu编译nodejs所需的软件并安装

    下面是Ubuntu编译Node.js所需的完整攻略: 1. 更新系统 在安装软件之前,您需要先更新您的系统。可以使用以下命令更新Ubuntu系统: sudo apt-get update sudo apt-get upgrade 2. 安装编译所需的软件 编译Node.js需要使用一些软件包,您可以使用以下命令安装它们: sudo apt-get insta…

    other 2023年6月26日
    00
  • android自定义popupwindow仿微信右上角弹出菜单效果

    Android自定义PopupWindow仿微信右上角弹出菜单效果攻略 在本攻略中,我将详细介绍如何实现一个仿微信右上角弹出菜单效果的自定义PopupWindow。这个效果通常用于显示更多选项或操作,类似于微信中的右上角菜单。 步骤一:创建PopupWindow布局 首先,我们需要创建一个自定义的PopupWindow布局。这个布局将包含菜单项和其他必要的U…

    other 2023年8月25日
    00
  • vue3中Vant的使用及说明

    Vue3中Vant的使用及说明攻略 简介 Vant是一套基于Vue3的移动端UI组件库,提供了丰富的组件和功能,可以帮助开发者快速构建高质量的移动应用。本攻略将详细介绍如何在Vue3项目中使用Vant,并提供两个示例说明。 安装 首先,确保你已经创建了一个Vue3项目。然后,通过以下命令安装Vant: npm install vant@next 引入Vant…

    other 2023年8月6日
    00
  • 苹果iOS9.1 Beta4固件下载地址汇总 百度网盘更新中

    苹果iOS9.1 Beta4固件下载地址汇总 百度网盘更新中攻略 简介 本攻略将详细介绍如何获取苹果iOS9.1 Beta4固件的下载地址,并说明如何使用百度网盘进行下载。请按照以下步骤进行操作。 步骤 步骤一:访问固件下载地址汇总网页 首先,打开你的浏览器,访问固件下载地址汇总网页。你可以在搜索引擎中搜索“苹果iOS9.1 Beta4固件下载地址汇总”,找…

    other 2023年8月4日
    00
  • win10提示taskmgr.exe文件系统错误1073741792代码怎么办?

    当遇到Windows 10提示“taskmgr.exe文件系统错误1073741792代码”的问题时,可以尝试下面的方法进行解决。 1. 运行SFC扫描 打开CMD命令行工具,以管理员身份运行。输入以下命令并按回车键: sfc /scannow SFC命令是系统文件检查器,用于扫描和修复Windows操作系统中的损坏文件。该命令需要一些时间来完成。完成后,重…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部