首页 > 编程语言 >Java双亲委派机制

Java双亲委派机制

时间:2024-03-01 23:01:35浏览次数:28  
标签:委派 Java ClassLoader group 双亲 JVM 线程 加载

Java 双亲委派机制

首先得了解一下JVM和ClassLoader

JVM

  • 当前主流的有三种JVM:

Sun公司:HotSpot

BEA:JRockit

IBM:J9VM

image-20240301212633477

  • 首先了解一下Java程序从编译到执行的整个生命周期:

.java

(经过javac.exe编译成class文件)=> .class

(经过类加载器ClassLoader,具体过程有加载、链接、初始化)=> 可以由JVM解析的Java字节码文件

(垃圾回收)=> 卸载

​ 在程序执行时,JVM中各区的线程占有情况:

线程私有:程序计数器、虚拟机栈、本地方法区

线程共享:堆、方法区、堆外内存

jvm-framework

  • JVM内存结构
    • 主要结构
      • 方法区
      • 堆区
      • 栈区(java程序栈)
      • 程序计数器:占用某PC寄存器的线程指向了该线程下一条执行语句的地址
      • 本地方法栈
    • 与本地方法接口的连接

​ 由于Java的底层是由C++实现,在Java哲学中,其封装了诸如内存管理、线程管理等底层操作,我们使用navie关键词来

​ 在使用例如线程操作时,线程启动函数start其实是封装了操作系统中的方法 private native void start0();,此部分依靠OS底层实现,即本地方法接口

    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

    private native void start0();

image-20240301214802452

类加载器

类加载器:对javac生成的class文件进行加载

如图是new一个对象,new的对象的引用存在java栈上,其数据等信息具体存储在堆区中

加载器的分类,我们可以通过一个演示demo进行查看:

  • Bootstrap ClassLoader 启动类加载器
  • Extention ClassLoader 标准扩展类加载器
  • Application ClassLoader 应用类加载器
    public static void main(String[] args) throws Exception {
        Class cls = Car.class;

        ClassLoader classLoader = cls.getClassLoader();
        System.out.println(classLoader);
        System.out.println(classLoader.getParent());
        System.out.println(classLoader.getParent().getParent());

    }

image-20240301223231451

双亲委派机制

当类进行加载时,需要进入到对应的类加载器,否则可能引起安全问题

所以双亲委派机制主要用于解决类错乱加载的问题,总结来说就是优先考虑上层的类加载器:

  • 类加载器收到类加载的请求
  • 将这个请求向上委托给父类加载器去完成,一直向上委托,知道启动类加载
  • 启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,否则,抛出异常,适知子加载器进行加载
  • 重复步骤3

img

参考

  1. https://pdai.tech/md/java/jvm/java-jvm-struct.html

  2. https://www.cnblogs.com/gh110/p/14917326.html#3类加载器

标签:委派,Java,ClassLoader,group,双亲,JVM,线程,加载
From: https://www.cnblogs.com/icfh/p/18048130

相关文章

  • Java流程控制08:For循环详解
     For循环:条件.for1.虽然所有循环结构都可以用while或者do...while表示,但Java提供了另一种语句----->for循环,使一些循环结构变得更加简单。2.for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环机构。 3.for循环执行的次数是在执行前就确定的......
  • 初识JavaScript逆向——以网易云音乐和招标网站为例
    前言:需要掌握一定的JavaScript基础,能看懂基础的JavaScript代码。我们平常在浏览网站的时候会看到许多加密的参数,如果需要知道它的原始数据,就需要知道整个加密过程,所以本篇文章就来介绍一下本人在初学逆向的时候一些笔记。想要获取加密过程大概来说有以下两个方法:(1)通过浏览器的i......
  • Java流程控制07:DoWhile循环
    DoWhile循环2.do...while循环2.1对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要及时不满足条件,也至少执行一次2.2do...while循环和while循环相似,不同的是,do...while循环至少会执行一次语法:......
  • Java流程控制06:While循环详解
    循环结构1.while循环1.1while循环最基本的循环,它的结构为:1.2只要布尔表达式为true,循环就会一直执行下去1.3大多数情况是会让循环停止下来,我们需要让一个表达式失效的方式来结束循环。1.4少部分情况需要循环一直执行,比如服务器的......
  • Java学习笔记——第二天
    进制知识二进制、八进制和十六进制二进制:只有0和1两个数字,按照逢2进1的方式表示数据。八进制:只有0~7八个数字,按照逢8进1的方式表示数据。十六进制:由0~9以及A,B,C,D,E,F,共十六个数字,按照逢16进1的方式表示数据,其中A,B,C,D,E,F分别代表十进制的10,11,12,13,14,15。Java程序中支持书写二进制、......
  • 前端 xlsx js javascript 处理excel 数据展示 日期格式处理
     1、参考https://blog.csdn.net/Seven71111/article/details/107375712https://blog.csdn.net/weixin_44987713/article/details/130129282 https://blog.csdn.net/qq_57952018/article/details/134812452 2、存在的问题a、千年虫b、定义一个转换日期格式的方法(转成......
  • Java 韩顺平老师的课,记的(前6章)笔记
    https://www.bilibili.com/video/BV1fh411y7R8/?p=110&spm_id_from=333.880.my_history.page.click&vd_source=92305fa48ea41cb7bedb3ab5e056d42d韩顺平老师在b站课的链接。 010,JDK的介绍 018,Java开发细节 6,一个源文件中最多只能有一个public类。其他类的个数不限。......
  • java调用接口
    longdateStr=System.currentTimeMillis()/1000;Stringurl="";//创建参数JSONObjectjsonObject=newJSONObject();jsonObject.put("Action","1111");jsonObject.put("DeviceType","2222&quo......
  • Java特性和优势
    Java特性和优势简单性面向对象可移植性高性能分布式动态性(反射)多线程安全性健壮性Java三大版本JavaSE:标准版(桌面程序,控制台开发)JavaME:嵌入式开发(手机,小家电)JavaEE:E企业级开发(Web端,服务器开发)JDK、JRE、JVMJDK:JavaDevelopmen......
  • JAVA格式化文件大小字节数据
      /***格式化字节数据**@paramsize大小,单位字节*/publicstaticStringformatSize(Longsize){if(size==null||size<=0){return"";}String[]units={"B","KB&quo......