JVM系列(三):双亲委派机制笔记

今天给大家分享JVM系列之双亲委派机制相关的知识。

1、Java类加载的过程

Java类的加载过程是动态的,它不会一次性把程序所有的类全部加载后再运行,而是先保障程序运行的基础类加载到JVM虚拟机当中,其他的类,一般是再需要的时候才会去加载,这样的运行机制也达到了节约内存的目的。

当JVM虚拟机加载某个class文件的时候,采用的是双亲委派模式(任务委派模式),就是将请求交给父类去处理。

2、类装载的方式

隐式装载:程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到JVM中。

显式装载:通过class.forName()等方法,显式加载需要的类

3、双亲委派机制的概念

双亲委派机制是指当一个类加载器收到某个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,它会先委托父类加载器在自己的搜索范围内找不到对应的类时,该类加载器才会尝试自己去加载。

4、双亲委派模式的工作流程

Application ClassLoader 收到一个类加载请求时,首先它自己不会先去尝试加载这个类,而是先将这个加载请求委派给父类加载器Extension ClassLoader去加载。

如果Extension ClassLoader收到一个类加载请求时,先将加载请求委派给父类加载器Bootstrap ClassLoader去完成。

如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载,如果加载成功了就不再让Extension ClassLoader加载,过程结束。

如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载如果加载成功了就不再让Application ClassLoader加载,过程结束。

如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。

如果所有的加载都失败了,就会抛出ClassNotFoundException异常。

理解:执行的情况都是由Bootstrap ClassLoader先加载,失败了轮到Extension ClassLoader加载,再失败了轮到Application ClassLoader,最后轮到自定义加载器加载。一般情况下大家写的java程序都是Application ClassLoader进行加载的。

5、双亲委派模型的核心代码

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{synchronized (getClassLoadingLock(name)) {// 首先,检查这类是否已经被加载过了Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {//如果存在父类加载器,则取找该类的父类加载器c = parent.loadClass(name, false);} else {//返回由引导类加载器加载的类;如果未找到,则返回 null。c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 如果父类加载器抛出ClassNotFoundException异常// 则说明父类加载器无法完成加载请求}if (c == null) {// 在父类加载器无法加载时// 再调用本身的findClass方法来进行加载long t1 = System.nanoTime();c = findClass(name);// 这是定义类加载器;记录统计数据sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}
}

6、双亲委派机制的作用

防止加载同一个class文件。通过委托的方式去询问父级是否已经加载过该class,如果加载过了就不需要重新加载。从而保证了数据安全。

通过委托的方式,保证Java核心class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库

安全起见&#xff0c;数据库的访问多半是要做限制的&#xff0c;所以就有一个直接的问题是&#xff0c;往往多数时候&#xff0c;在别的机器上&#xff08;比如自己本地&#xff09;&#xff0c;是不能访问数据库的&#xff0c;给日常使用造成了很大不便。所以前几天做了个需求…

运维安全:微软远程桌面修改默认远程端口

远程桌面是网络管理员必备的技能&#xff0c;今天给大家聊聊Windows本身就自带的远程桌面功能&#xff0c;如何修改远程的默认端口&#xff08;3389&#xff09;&#xff0c;让你的远程服务器更加安全。 下面给大家介绍一下如何修改远程桌面的默认端口&#xff0c;具体步骤如下…

Android Studio如何导出可供Unity使用的aar插件详解

前言 项目之前使用Eclipse导出的jar文件来做与Android交互&#xff0c;最近因为工作需要需使用Android Studio的aar文件&#xff0c;网上参考了部分文章&#xff0c;也结合自己的理解重新整理一下具体的方法&#xff0c;通过写一个测试Demo来表述Android Studio创建aar的过程与…

JVM系列(四):沙箱安全机制笔记

今天主要给大家分享JVM的沙箱安全机制笔记 1、沙箱机制的概念 Java安全模型的核心就是Java沙箱(sandbox)。 沙箱机制就是将Java代码限定只能在虚JVM虚拟机中特定的运行范围&#xff0c;并且严格限制代码对本地系统资源访问&#xff0c;通过这样的方式来保证对Java代码的有效隔…

JVM系列(五):native关键字用法介绍

今天继续给大家分享JVM中native关键字用法介绍 1、native概念 native关键字修饰的Java方法是一个原生态方法&#xff0c;方法对应的实现Java作用范围达不到&#xff0c;而是在用其他编程语言&#xff08;如C和C&#xff09;文件中实现。Java语言本身不能直接对操作系统底层进行…

ASP.NET Core 介绍和项目解读

1. 前言2. ASP.NET Core 简介 2.1 什么是ASP.NET Core2.2 ASP.NET Core的特点2.3 ASP.NET Core 项目文件夹解读 2.3.1 项目文件夹总览2.3.2 project.json和global.json2.3.1 Properties——launchSettings.json2.3.4 Startup.cs &#xff08;1&#xff09; 构造函数&#xff08…

JVM系列(六):JVM内存区域中程序计数器介绍

今天继续给大家分享JVM的相关知识&#xff0c;今天介绍一下JVM内存区域的程序计数器。 1、程序计数器概念 JVM中的程序计数寄存器&#xff08;Program Counter Register&#xff09;中Register的命名来源于CPU的寄存器&#xff0c;寄存器用来存储指令相关的现场信息。 CPU只…

JVM系列(七):虚拟机栈的相关知识介绍

今天继续给大家分享JVM系列的相关知识&#xff0c;今天介绍一下虚拟机栈的介绍。 1、虚拟机栈的概念 虚拟机栈也称为Java栈&#xff0c;Java每个main方法被执行的时候&#xff0c;JVM都会同步创建一个栈帧&#xff08;Stack Frame&#xff09;&#xff0c;通过存储局部变量表…

JVM系列(八):堆(Heap)的相关知识介绍

目录 1、JVM堆的概念 2、JVM堆的特点 3、JVM堆的内部结构 3.1 组成 3.2 堆内存内部空间所占比例 3.3 永久代和元空间区别 4、堆空间的大小设置 5、堆空间垃圾回收 1、JVM堆的概念 JVM中的堆是用来存放对象的内存空间&#xff0c;几乎所有的Java对象、数组都存储在JVM的…

电脑技巧:Hyper-V安装UOS操作系统图文教程

今天给大家分享微软官方Hyper-v虚拟机管理软件安装UOS操作系统图文教程&#xff0c;感兴趣的朋友也可以下载试一试&#xff0c;当然有啥问题也可以互相沟通交流&#xff01; 1、首先任务管理切换到性能选项卡&#xff0c;查看虚拟化是否已经启用&#xff0c;如果没有启用的话&…

JVM系列(九):MinorGC、MajorGC、FullGC垃圾回收介绍

今天给大家继续分享MinorGC、MajorGC、FullGC相关知识&#xff0c;如有不对的地方欢迎指正&#xff01; 1、MinorGC &#xff08;新生代垃圾回收&#xff09; JDK1.8 堆内部结构 从年轻代空间&#xff08;包括 Eden 和 Survivor 区域&#xff09;回收内存被称为 Minor GC&…

JVM系列(十):JVM垃圾回收算法相关知识

今天给大家继续分享JVM垃圾回收算法相关知识&#xff0c;如有不对的地方欢迎指正。 JVM垃圾回收算法主要有标记清除、复制算法、标记整理、分代收集四种&#xff0c;下面来逐一介绍。 1、标记清除&#xff08;Mark-Sweep&#xff09; 标记清除作为最基础的垃圾回收算法&#…

Java8 拼接字符串 StringJoiner

StringJoiner是Java8新出的一个类&#xff0c;用于构造由分隔符分隔的字符序列&#xff0c;并可选择性地从提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。 我们查看一下一下代码&#xff0c;试着猜一下。 1.简单的字符串拼接…

分享Git常见的项目托管平台

今天给大家分享Git常见的项目托管平台&#xff0c;大家一起来看看吧&#xff01; 1、GitHub GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持Git作为唯一的版本库格式进行托管&#xff0c;故名GitHub。是全球最大、代码质量最高的Git开源项目平台。遗憾的…