一、概述

虚拟机把字节码文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型。这些动作都是在运行期间完成了,这也是java动态绑定的功能

二、类加载总流程


加载、验证、准备、初始化、卸载这5个阶段顺序是确定的。 解析阶段不一定,它在某些情况下可以在初始化阶段后再开始。

2.1 加载

  1. 通过一个类的全限定名来获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法去的运行时结构数据
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

第一步获取二进制流,有各种方式:

  • zip包中读取(jar war等)
  • 运行时动态计算生成,比如动态代理技术
  • 由其他文件生成,比如JSP最后都会翻译成Class。

第三步中生成的Class对象,不一定存在堆内存中,比如HotSpot虚拟机就把它放大了方法去中。

2.2 验证

在进行编译的时候其实已经验证,为什么还需要验证呢?因为比如动态加载,是动态的创建class字节码,所以这个时候不是静态的进行编译,所以对于这些动态生成的class,必须进行验证

2.3 准备

对静态的字段进行默认初始化,比如对static int a; 这准备阶段将a=0;
注意这个静态变量使用的内存都将在方法区中进行分配

2.4 解析

这个就是解析出方法或者字段的真正的地址。
解析阶段是虚拟机将常量池中的符号引用转变成直接引用的过程。

2.4 初始化

引入 方法
方法:编译器自动收集类中所有的静态赋值动作或者静态代码块中的语句合并产生的。收集的顺序根据静态变量的赋值动作和静态代码块出现的顺序决定的。

三、类的加载器

实现将class文件加载到内存的二进制流的模块叫做类的加载器。
类的加载器可以说是java语言的一项创新,也是Java语言流行的重要原因之一。 他最初是为了Java Applet设计的,不过事与愿违,Applet基本已经死掉。但是在类的层次划分、OSGi、热部署、代码加密等领域大放异彩

3.1 类与类的加载器

每一个类加载器都拥有一个独立的类名称空间。 一个类是由这类本身和他的类加载器一起确定的

下面这个例子就是证实:

class MyClassLoader extends ClassLoader{@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {String fileName = name.substring(name.lastIndexOf(".")+1)+".class";InputStream is = getClass().getResourceAsStream(fileName);if(is == null){return super.loadClass(name);}byte[] b = null;try {b = new byte[is.available()];is.read(b);} catch (IOException e) {throw new ClassNotFoundException(name);}return defineClass(name,b,0,b.length);}
}public class ClassLoaderTest {public static void main(String[] args) throws Exception {ClassLoader myClassLoader = new MyClassLoader();Object obj = myClassLoader.loadClass("com.cisco.learn.jvm.ClassLoaderTest").newInstance();System.out.println(obj.getClass());System.out.println(obj instanceof ClassLoaderTest);//结果为false。 因为类的加载器不一样}
}

3.2 双亲委派模型

类的加载器介绍:

  1. Bootstrap Classloader:加载JAVA_HOME/lib下面被java虚拟机识别的类库(按照名称识别)。
  2. Extension Classloader:加载JAVA_HOME/lib/ext目录中的类库
  3. Application Classloader:负责加载Classpath上面指定的类库,也是我们最经常使用的一个。


采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。
其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改

3.3 破坏双亲委派模型

典型例子1:JDBC的加载
比如需要加载一个类(Connection),首先会寻找父亲取加载,一般会寻找到bootstrap上去加载,但是这个bootstrap加载器上只有该类的接口,真正的实现类是在用户提供的jar包中(比如mysql的jar包)。但是bootstrap类中怎么可能只能去寻找子类的classloader去加载,而且他也找不到 也违反了双亲委派。
最后引入了Thread context Classloader机制才解决的,这里就不细说了。

典型例子2:模块热部署技术
OSGI目前我也不太熟悉

第七章 虚拟机类加载机制相关推荐

  1. [总结]-第七章 虚拟机类加载机制

    2019独角兽企业重金招聘Python工程师标准>>> [总结]-第七章 虚拟机类加载机制 常见操作 1.查看class二进制内容 hexdump -C demo.class 2.打 ...

  2. 第7章 虚拟机类加载机制

    文章目录 7.1 概述 7.2 类加载的时机 7.3 类加载的过程 7.3.1 加载 7.3.2 验证 7.3.3 准备 7.3.4 解析 7.3.5 初始化 7.4 类加载器 7.4.1 类与类加载 ...

  3. 深入理解java虚拟机 第7章 虚拟机类加载机制

    目录 7.1 概述 7.2 类加载的时机 类加载生命周期 开始顺序 类初始化时机 主动引用 被动引用 接口加载与类加载过程的区别 7.3 类加载的过程 7.3.1 加载 7.3.2 验证 7.3.3 ...

  4. 《深入理解Java虚拟机》第7章 虚拟机类加载机制

    7.2 类加载的时机 类从被加载到VM内存中开始,到卸载出内存为止,它的生命周期包括了:加载,验证,准备,解析,初始化,使用,卸载,共7个阶段.其中验证,准备,解析统称为连接. 其中解析的顺序不一定, ...

  5. Java虚拟机类加载机制

    虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. Java语言里,类型的加载和连接过程是在程序运行期间 ...

  6. 转载---虚拟机类加载机制

    虚拟机类加载机制  虚拟机把描述的类的数据从class文件加载到内存后,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.  类加载的时机 类被 ...

  7. 深入理解JVM虚拟机(六):虚拟机类加载机制

    1. 概述 虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类记载机制. 与那些在编译时需要进行连接工作 ...

  8. Java虚拟机类加载机制——案例分析

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  9. jvm(7)-虚拟机类加载机制

    [0]README 0.1)本文转自"深入理解jvm",旨在学习  虚拟机类加载机制 的基础知识: [1]概述 1)类加载机制:虚拟机把描述类的数据从Class 文件加载到内存,并 ...

最新文章

  1. 如何保证MySQL和Redis的数据一致性?10张图带你搞定!
  2. css_04 | CSS——CSS 值和单位
  3. groupByKey、reduceByKey区别(转)
  4. 光纤收发器模块如何选购,光纤收发器模块选购原则
  5. 如何测试Nginx的高性能
  6. 程序编号以后计算机能够查出,华威大学研究人员开发出计算机程序,可发现量子计算机中的“泄漏”...
  7. 洛谷 P1396 营救
  8. Embedding 技术在推荐系统中的应用实践
  9. (转)使用C#开发ActiveX控件
  10. html文件类型怎么改,更改文件类型,教您文件类型如何更改
  11. 微信小程序自适应横屏全屏显示(以PPT为例)
  12. Shell脚本-Dong
  13. 基于深度信念网络的事件识别
  14. [PAT] PAT注意点
  15. 阿里云跨账号迁移云服务器实例
  16. pytorch是什么?解释pytorch的基本概念
  17. 智能对话机器人开发实战案例剖析(2)
  18. 换了5G手机不会用5G网络?赶快来补课!
  19. Adobe XD常见问题和解决方案
  20. 手机端页面自适应解决方案—rem布局

热门文章

  1. 图片助手image assistant
  2. 商业书籍精华摘要《专注》丹尼尔·戈尔曼 Focus by Daniel·Goleman
  3. Blackmagic黑魔法摄像机braw视频文件修复方法
  4. 马斯克的又一次胜利!SpaceX公司获得美国航天局NASA的授权进行空间站飞行!
  5. Excel企业级明星函数
  6. 使用element-ui,一键复制粘贴实现上传功能
  7. Ant Design of Angular---NG ZORRO引入样式上的问题
  8. 关类型转换-作为参考
  9. IPresenter
  10. 虚拟机网络连接的三种方式