我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章给大家分享的是有关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高级之虚拟机加载机制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

Java虚拟机之类加载的示例分析

小编给大家分享一下Java虚拟机之类加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序
2023-06-15

Java虚拟机发展变化的示例分析

这篇文章将为大家详细讲解有关Java虚拟机发展变化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向
2023-06-14

Java进阶之SPI机制的示例分析

这篇文章将为大家详细讲解有关Java进阶之SPI机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言SPI的英文全称为Service Provider Interface,字面意思为服务提
2023-06-15

java之JVM各类机制的示例分析

这篇文章将为大家详细讲解有关java之JVM各类机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户
2023-06-14

Java插件扩展机制之SPI的示例分析

这篇文章给大家分享的是有关Java插件扩展机制之SPI的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制
2023-06-20

java中锁机制的示例分析

这篇文章主要介绍java中锁机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使
2023-06-19

基于编译虚拟机jvm之openjdk编译的示例分析

这篇文章给大家分享的是有关基于编译虚拟机jvm之openjdk编译的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java只所以被推广,实际上很大原因是因为本身是跨平台的,很大作用是因为虚拟机的关系。一般
2023-05-30

CentOS虚拟机下相关操作的示例分析

小编给大家分享一下CentOS虚拟机下相关操作的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在VM虚拟机中安装完Redhat系统之后如果需要用secureCRT连接linux系统的话操作步骤如下:1.进入linu
2023-06-10

Java虚拟机中内存分配与回收策略的示例分析

小编给大家分享一下Java虚拟机中内存分配与回收策略的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内存分配与回收策略Java技术体系的自动内存管理,最根
2023-06-25

Java异常处理机制的示例分析

这篇文章给大家分享的是有关Java异常处理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.初识异常我们在写代码的时候都或多或少碰到了大大小小的异常,例如:public class Test {
2023-06-26

C++之Qt5双缓冲机制的示例分析

这篇文章主要介绍了C++之Qt5双缓冲机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 双缓冲机制所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一
2023-06-20

kubernetes中负载均衡机制Ingress的示例分析

这篇文章将为大家详细讲解有关kubernetes中负载均衡机制Ingress的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:前言Kubernetes在设计之初就充分考虑了针对容器的服务发现与负
2023-06-04

Java中异常处理机制的示例分析

这篇文章给大家分享的是有关Java中异常处理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能
2023-06-03

Java知多少虚拟机JVM)以及跨平台原理的示例分析

这期内容当中小编将会给大家带来有关Java知多少虚拟机JVM)以及跨平台原理的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,
2023-06-17

Java高级应用之斗地主游戏的示例分析

小编给大家分享一下Java高级应用之斗地主游戏的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!运用HashMap、ArrayList、List类实现斗地主综合案例,模拟斗地主游戏的随机发牌,并按照牌的大小和花色进行
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录