当前位置: 首页 > article >正文

Java基础-JVM

JVM构成部分

类加载系统

类加载子系统的作用是将磁盘中的.class文件加载到内存当中。工作过程如下:

  • 加载:通过类全路径名获取二进制字节流;将这个二进制字节流代表的数存储构转化为方法区运行时数据结构;在内存生成一个代表该类的Class对象,作为方法区该类的访问入口。
  • 链接
    • 验证:验证加载的.class文件是否正确
    • 准备:为static对象分配内存并赋零值
    • 解析:符号引用(一组能描述目标对象的字面量,如全路径名)解析为直接引用(指向目标对象的指针,相对偏移量或能间接定位目标的句柄)
  • 初始化:给对象赋真实的值

类加载器

用于实现类的加载动作,对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每 一个类加载器,都拥有一个独立的类名称空间。比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个 Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。

  • 引导类类加载器()
    • BootstrapClassLoader:加载jre中ib目录下的类
  • 自定义类加载器(继承ClassLoader抽象类)
    • ExtClassLoader:加载jre中ib/ext目录下的类
    • AppClassLoader:加载当前项目classpath下的类

双亲委派

工作过程是:类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的 加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请 求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。双亲委派实现:

    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
                
                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

http://www.kler.cn/news/367850.html

相关文章:

  • springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic
  • 解决电脑更改IP地址后无法连接网络的实用指南
  • Vue学习笔记(四)
  • Ubuntu20.04系统安装opencv
  • CSS行块标签的显示方式
  • 腾讯云DBA面试(一面)
  • 【宝塔面板】轻松使用docker搭建lobe-chat项目(AI对话)
  • js纯操作dom版购物车(实现购物车功能)
  • Cannot read property ‘prototype’ of undefined 表单
  • 云资源管理与优化:提升效率的技术指南
  • 【数据集】NCEP辐射数据-用于计算漫射天窗比(diffuse skylight ration)
  • ELK之路第二步——可视化界面Kibana
  • Hadoop:yarn的Rust API接口
  • 面向对象思想和面向过程思想分析
  • 【LeetCode】每日一题 2024_10_27 冗余连接(并查集)
  • JavaWeb的小结08
  • 前端聊天室页面开发(赛博朋克科技风,内含源码)
  • Axure随机验证码高级交互
  • 血量更新逻辑的实现
  • Windows AD 域的深度解析 第一篇:AD 域原理与多系统联动
  • 考研要求掌握的C语言程度(堆排序)1
  • HBase2.4.17 修改znode后master初始化失败
  • Flutter中使用Cookies
  • 动态库和静态库
  • 第五十三章 安全元素的详细信息 - Signature 详情
  • MySQL8.0.40编译安装