iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java高级之虚拟机加载机制的示例分析
  • 286
分享到

Java高级之虚拟机加载机制的示例分析

java虚拟机 2023-05-30 18:05:57 286人浏览 独家记忆
摘要

这篇文章给大家分享的是有关Java高级之虚拟机加载机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JVM要加载的是二进制流,可以是.class文件形式,也可以是其他形式,按照它加载的标准来设计就不会有

这篇文章给大家分享的是有关Java高级之虚拟机加载机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

JVM要加载的是二进制流,可以是.class文件形式,也可以是其他形式,按照它加载的标准来设计就不会有太大问题。

以下主要就机制和标准两个问题分析一番:

首先来Java类文件的加载机制 ,跟变量的加载机制类似,它先把Class文件加载入内存,再对数据进行验证、解析和初始化,最终形成虚拟机可以直接使用的Java类型。由于Java是采用JIT机制,所以加载时会比较慢,但优点也明显,具有高度灵活性,支持动态加载和动态连接。

接下来就讲讲类的加载过程:

一个类加载的基本过程是按照下面的顺序 来,但也有不严格按照这个顺序来的,也有打乱顺序来的,如动态加载就得先初始化再解析。

1、加载

由虚拟机自行决定,但也有由于下面的阶段要执行而执行上面阶段的情况。

这时虚拟机会做三件事:

第一、通过全限定名读取文件的二进制流;

第二、把文件里的静态方法和变量放到方法区中;

第三、生成一个对象放入堆中,作为访问入口。

注意第一条,仅是读取二进制流,没说具体从什么文件中读,也没说从哪里读,所以造就Java很强的扩展性,可以从jar、Zip中,也可以从网络层、数据库层等 。

主要是对象和方法区的声明。

2、验证

确保二进制流符合虚拟机的要求, 不符合会报VerifyError。

第一、文件格式验证,是否有魔数,是否符合Java文件的要求;

第二、元数据验证,是否符合Java代码规范,如abstract类是否直接被实例化,普通类有无间接或直接父类Object等;第三、字节码验证,对数据流和控制流进行分析,保证不会做出危害虚拟机的行为,如 是否调用不存在的指令,是否把父类赋值给子类,是否把对象赋值给一个非此类型的对象等;

第四、符号引用验证,主要是类、变量、方法描述是否能找的到,如全限定名是否能找到该文件,是否具有可访问性等。

主要对内部结构的判定

3、准备

为类变量赋初值,通常为0值如静态变量,而不会为实例变量赋值。

4、解析

将常量池中的符号引用转化为直接引用的过程。这里说的符号引用指变量类型,直接引用指可以直接定位到对象的句柄。类、方法、字段、接口解析,根据全限定名获得相关对象,拿到它的类型,若无对所在类访问权会抛出IllegalAccessError,无字段NoSuchFieldError,无方法NoSuchMethodError,是类不是接口会抛出IncompatibleClassChangeError

5、初始化

根据程序要求加载类和必要的资源。有且仅有四种情况,需要主动初始化后才能执行接下来的操作 ,所以要先执行上面的四步。

第一、有new或static关键字的类,new生成对象,static静态加载,这两个很明显要执行初始化了;

第二、使用类有父类,这没办法了;

第三、反射类里的方法,那肯定要初始化了对不对;

第四、执行的主类,用main方法的类。其他被动初始化的情况不需要考虑。

小例子:

public class SuperClass {static {System.out.println(“SuperClass!!”);}public static int value = 1;}public class SubClass extends SuperClass {static {System.out.println(“SubClass!!”);}}public class TestClassLoad {public static void main(String[] args) {System.out.println(SubClass.value);SuperClass superClass = new SubClass();}}SuperClass!!1SubClass!!

执行结果说明一个问题: 子类调用父类变量的时候 ,子类没有初始化,因为 此时的代码关系跟子类无关 ;子类初始化的时候,父类也没有再初始化,因为 父类在当前方法体中已经初始化 过了。接口与父类的唯一区别在于, 接口初始化不会要求父接口,只有用到父接口才会初始化 ,同样的都会生成类构造器。

这个时候加载类构造器,会初始化类中所有变量,当然父类先于子类初始化

6、使用

加载完之后,该怎么样调用怎么样调用,绘图啊,计算啊等等

7、卸载

类不再被调用

两个类是否相等,主要在于第一使用同一个加载器加载,第二全限定名地址一致

为什么要提出上面的问题呢?接下来要讲讲虚拟机的一个加载机制。

在java虚拟机的角度来看,有两种类加载器,一种叫系统加载器(Bootstrap ClassLoader),一种叫自定义加载器(extends ClassLoader),这种呢又分为两个,一种叫应用加载器,一种叫扩展类加载器,一般默认为前者;而我们的应用程序加载主要由上面三个加载器相互配合完成的。三者的关系如Application–>Extension–>Bootsrap,双亲委派机制是指两两以组合的方式,子加载器先去调用父加载器的方法,没找到目标对象再去用子加载器

伪代码如下:

loadClass(String name,boolean resolve){Class c=findLoadedClass()if(c==null){if(parent !=null)c=parent.loadClass(name,false);c=findBootstrapClassOrNull(name);}catch(ClassNotFoundException e){ }if(c==null)c=findClass(name);}

Java提倡我们去把自己调用类的逻辑写在findClass里,这样有助于双亲委派机制的正常使用。

破坏1、重写loadClass

破坏2、使用线程上下文加载器去让父加载器去调用子加载器的方法

破坏3、热加载 现在常用的做法是 自定义类加载器并 将原bug模块覆盖-OSGI

但由于自定义加载器之间的规则如果混乱,出现同时互相引用的问题,那么会最终找不到类,而出现线程死和内存泄露的问题。

关于热修复,也被称为插件,目前比较流行的有HotFix、Nuwa、DroidFix、AndFix等,这些框架均可以在GitHub或其他地方找到,原理如上,方法多样,有覆盖的、有重定向的等等,通过配置、设置action等方式;而作为插件需要满足以下条件:

可以独立安装,但不可独立运行

具有向下兼容性,即可拓展性

只能运行在宿主程序中,而且可以被禁用、替换

感谢各位的阅读!关于“Java高级之虚拟机加载机制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Java高级之虚拟机加载机制的示例分析

本文链接: https://www.lsjlt.com/news/220397.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java高级之虚拟机加载机制的示例分析
    这篇文章给大家分享的是有关Java高级之虚拟机加载机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Jvm要加载的是二进制流,可以是.class文件形式,也可以是其他形式,按照它加载的标准来设计就不会有...
    99+
    2023-05-30
    java 虚拟机
  • Java虚拟机之类加载的示例分析
    小编给大家分享一下Java虚拟机之类加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序...
    99+
    2023-06-15
  • Java虚拟机之类加载
    目录一、类加载流程1.1 类加载条件1.2 加载1.3 验证1.4 准备1.5 解析1.6 初始化二、ClassLoader2.1 Class...
    99+
    2024-04-02
  • Java虚拟机类加载器之双亲委派机制模型案例
    1. 双亲委派模型是什么? 当某个类加载器需要加载某个.class字节码文件时,它首先把这个任务委托给它的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类...
    99+
    2024-04-02
  • Java虚拟机JVM类加载机制(从类文件到虚拟机)
    目录一、类加载机制简介二、类加载机制过程 2.1、加载(Load)2.2、连接(Linking)2.3、初始化(Initialize)三、类加载器Classloader&n...
    99+
    2024-04-02
  • Java虚拟机发展变化的示例分析
    这篇文章将为大家详细讲解有关Java虚拟机发展变化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向...
    99+
    2023-06-14
  • java之JVM各类机制的示例分析
    这篇文章将为大家详细讲解有关java之JVM各类机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户...
    99+
    2023-06-14
  • Java进阶之SPI机制的示例分析
    这篇文章将为大家详细讲解有关Java进阶之SPI机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言SPI的英文全称为Service Provider Interface,字面意思为服务提...
    99+
    2023-06-15
  • JVM分析之类加载机制详解
    目录1、前言2、类加载是什么3、类加载过程3.1 加载3.2 链接3.3 初始化4、总结1、前言 JVM内部架构包含类加载器、内存区域、执行引擎等。日常开发中,我们编写的java文件...
    99+
    2022-11-13
    JVM类加载机制 JVM类加载
  • Java之类加载机制案例讲解
    1.类加载 <1>.父子类执行的顺序 1.父类的静态变量和静态代码块(书写顺序) 2.子类的静态变量和静态代码块(书写顺序) 3.父类的实例代码块(书写顺序) 4.父类...
    99+
    2024-04-02
  • Java插件扩展机制之SPI的示例分析
    这篇文章给大家分享的是有关Java插件扩展机制之SPI的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制...
    99+
    2023-06-20
  • java中锁机制的示例分析
    这篇文章主要介绍java中锁机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使...
    99+
    2023-06-19
  • java虚拟机JVM类加载机制原理(面试必问)
    目录1、类加载的过程。1)加载2)验证3)准备4)解析5)初始化2、Java 虚拟机中有哪些类加载器?1)启动类加载器(Bootstrap ClassLoader):2)扩展类加载器...
    99+
    2024-04-02
  • 基于编译虚拟机jvm之openjdk编译的示例分析
    这篇文章给大家分享的是有关基于编译虚拟机jvm之openjdk编译的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java只所以被推广,实际上很大原因是因为本身是跨平台的,很大作用是因为虚拟机的关系。一般...
    99+
    2023-05-30
    jvm 虚拟机 openjdk
  • Java8虚拟机内存溢出的示例分析
    这篇文章给大家分享的是有关Java8虚拟机内存溢出的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 Java8虚拟机(JVM)内存溢出实战 前言 相信很多JAVA中...
    99+
    2024-04-02
  • java类加载的示例分析
    这篇文章将为大家详细讲解有关java类加载的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、说明当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过以下三个步骤对该类进行初始化。2、...
    99+
    2023-06-15
  • webpack源码之loader机制的示例分析
    这篇文章主要介绍webpack源码之loader机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!loader概念loader是用来加载处理各种形式的资源,本质上是一个函数...
    99+
    2024-04-02
  • Vue源码分析之虚拟DOM的示例分析
    小编给大家分享一下Vue源码分析之虚拟DOM的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么需要虚拟dom?虚拟DOM就是为了解决浏览器性能问题而被...
    99+
    2023-06-15
  • CentOS虚拟机下相关操作的示例分析
    小编给大家分享一下CentOS虚拟机下相关操作的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在VM虚拟机中安装完Redhat系统之后如果需要用secureCRT连接linux系统的话操作步骤如下:进入linux系...
    99+
    2023-06-10
  • Java虚拟机中内存分配与回收策略的示例分析
    小编给大家分享一下Java虚拟机中内存分配与回收策略的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内存分配与回收策略Java技术体系的自动内存管理,最根...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作