详解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日

相关文章

  • Java使用线程同步解决线程安全问题详解

    Java使用线程同步解决线程安全问题详解 概述 Java中多线程带来的好处是同时可以执行多个任务,但是线程之间共享同一个全局变量或对象可能会出现线程安全问题。线程安全问题的解决最主要的方法是使用锁机制,也就是线程同步来保证同一时刻只有一个线程能够访问共享变量或对象。 线程同步可以通过synchronized关键字来实现,synchronized关键字可以保证…

    other 2023年6月27日
    00
  • Sqlmap爆库命令的简单使用

    作为一款流行的Java Web开发框架,Spring Boot提供了许多有用的注解来简化开发过程。其中,@Cacheable注解可以用于实现缓存功能,提高应用程序的性能和响应速度。本文将详细讲解@Cacheable注解的作用和使用方法,并提供两个示例说明。 作用 @Cacheable注解的作用是将一个方法的返回值缓存起来,以便在下次调用该方法时可以直接从缓存…

    other 2023年5月5日
    00
  • 基于java类路径classpath和包的实例讲解

    在讲解”基于java类路径classpath和包的实例讲解”的攻略之前,我们先了解一下什么是java类路径以及包。 Java类路径(Classpath) Java类路径,即Classpath,指的是Java虚拟机(JVM)查找类和资源文件的路径,默认情况下,JVM通过系统环境变量”CLASSPATH”来确定Java类路径。 一个Java程序通常会依赖于多个类…

    other 2023年6月27日
    00
  • java8中list转换对象set

    在Java 8中,可以使用Stream API和Lambda表达式将List转换为Set。以下是使用Java 8的完整攻略: 步骤1:创建List对象 首先,创建一个List,用于存储要转换为Set的元素。以下是一个示例代码: List<String> list = new ArrayList<>(); list.add("…

    other 2023年5月7日
    00
  • Win10系统双显卡怎么快速切换?

    Win10系统双显卡怎么快速切换? 对于使用有独立显卡和集成显卡的Win10系统设备,为了在不同使用场景下获得最佳的图形性能,需要在独立显卡和集成显卡之间进行快速切换。 1. 确认设备是否拥有双显卡 首先需要确认自己的设备是否拥有双显卡,可以通过以下步骤进行确认: 按下Win + X键,选择“设备管理器”; 展开显示适配器选项卡,如果此处出现两个显卡,则说明…

    other 2023年6月27日
    00
  • iphone6s死机后如何重启 iphone6s死机了怎么办

    针对“iphone6s死机后如何重启 iphone6s死机了怎么办”这两个问题,我将为您提供完整的攻略。具体步骤如下: iphone6s死机后如何重启 长按开机键和音量键 当您的iPhone 6s出现死机时,您可尝试按住机身右侧的开机键和音量键不放几秒钟。直到出现Apple标志或者其他提示,松开按键。 连接电脑及iTunes 如果长按开机键和音量键后无反应,…

    other 2023年6月27日
    00
  • 解决192.168.1.1路由器进不去的故障

    下面是详细讲解“解决192.168.1.1路由器进不去的故障”的完整攻略。 前置条件 在进行故障排除前,请先确认以下事项: 确认路由器电源已经通电并正常工作。 确认与路由器已连接的电缆和无线连接已正常工作。 使用正确的IP地址输入路由器管理界面,即本文中的“192.168.1.1”。 确认账户名和密码正确。 路由器管理界面 路由器管理界面是一个用于配置路由器…

    other 2023年6月27日
    00
  • vmware虚拟机各个版本的安装破解(附安装包和注册机)

    vmware虚拟机各个版本的安装破解(附安装包和注册机) 在使用虚拟机进行操作系统和软件的安装和测试时,vmware无疑是最受欢迎和广泛应用的虚拟机之一。但是,在体验vmware的强大功能时,我们往往会遇到需要购买授权或使用试用期之类的限制。本文将介绍如何通过破解的方式安装vmware虚拟机,并提供相关的安装包和注册机。 破解vmware虚拟机 安装vmwa…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部