文档章节

Java虚拟机jvm学习四:类加载器

silence88
 silence88
发布于 2017/02/27 12:10
字数 725
阅读 18
收藏 1

一、class装载验证流程

1、加载

取得类的二进制流

转为方法区数据结构

在Java堆中生成对应的java.lang.Class对象

2、链接

  • 验证:保证Class流的格式是正确的。
    • 文件格式的验证

      是否以0xCAFEBABE开头

      版本号是否合理

    • 元数据验证(语义语法是否正确)

      是否有父类

      继承了final类?

      非抽象类实现了所有的抽象方法

    • 字节码验证 (很复杂)

      运行检查

      栈数据类型和操作码数据参数吻合

      跳转指令指定到合理的位置

    • 符号引用验证

      常量池中描述类是否存在

      访问的方法或字段是否存在且有足够的权限

  • 准备
    • –分配内存,并为类设置初始值 (因为初始化的是类信息,所以在方法区中)

      public static int v=1;在准备阶段中,v会被设置为0,在初始化的<clinit>中才被设置1。

      对于static final类型,在准备阶段就会被赋上正确的值:public static final  int v=1;

  • 解析
    • 符号引用替换为直接引用:

      • 什么是符号引用?符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。这样,对于其他类的符号引用必须给出类的全名。对于其他类的字段,必须给出类名、字段名以及字段描述符。对于其他类的方法的引用必须给出类名、方法名以及方法的描述符。

      • 什么是直接引用?也就是我们说的地址

3、初始化

真正执行你编写的代码,依上而下执行代码,主要包括static变量赋值语句以及static代码块,然后执行构造函数<clinit>,子类的<clinit>调用前保证父类的<clinit>被调用,<clinit>是线程安全的。

类什么时候才被初始化?

1)创建类的实例,也就是new一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射(Class.forName("com.lyj.load"))

5)初始化一个类的子类(会首先初始化子类的父类)

6)JVM启动时标明的启动类,即文件名和类名相同的那个类

只有这6中情况才会导致类的类的初始化。

二、Classloader

1、什么是类装载器ClassLoader

  • ClassLoader是一个抽象类
  • ClassLoader的实例将读入Java字节码将类装载到JVM中
  • ClassLoader可以定制,满足不同的字节码流获取方式
  • ClassLoader负责类装载过程中的加载阶段

© 著作权归作者所有

共有 人打赏支持
silence88
粉丝 7
博文 71
码字总数 72855
作品 0
深圳
程序员
私信 提问
Java核心机制:反射机制的原理及应用方法

一、java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): 1、Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在...

Java架构资源分享
11/25
0
0
JVM 虚拟机(对象创建,类加载器,执行引擎等),

1.揭开 Java 对象创建的奥秘? 2.class 文件结构详解? 3.详解 Java 类的加载过程? > Java 对象创建,class 文件结构 Java对象模型 。Java对象保存在堆内存中。在内存中,一个Java对象包含三...

desaco
08/29
0
0
03-《深度拆解JVM》之Java虚拟机是如何加载Java类的?

一、JVM的类加载 Java 虚拟机中的类加载,从 class 字节码文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三大步骤。其中,链接过程中同样需要验证;而内存中的类没有经过初始化,...

飞鱼说编程
09/13
0
0
阿里P8技术心得:java反射机制的核心原理

一、java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): 1、Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在...

Java架构
11/25
0
0
JVM系列开篇:为什么要学虚拟机?

跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看。所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试。但我经过了几年的学习和实战,我发现...

陈树义
11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GROUP BY GROUPING SETS

GROUPING SETS 子句是 SELECT 语句的 GROUP BY 子句的扩展。通过 GROUPING SETS 子句,您可采用多种方式对结果分组,而不必使用多个 SELECT 语句来实现这一目的。这就意味着,能够减少响应时...

hblt-j
8分钟前
0
0
selenium之表格的定位

真的勇士, 敢于直面惨淡的warning、 敢于正视淋漓的error 目录 被测试网页的HTML代码 1.遍历表格所有单元格 2.定位表格中的某个元素 3.定位表格中的子元素 总结 浏览器网页常常会包含各类表...

程序猿拿Q
13分钟前
0
0
adb命令启动展讯平台工厂模式

adb命令启动展讯工厂模式: adb shell am start com.sprd.engineermode/com.sprd.engineermode.EngineerModeActivity...

东街小霸王
14分钟前
0
0
mtu值怎样设置才网速最快

一、什么是 MTU 值 1 从字面上来说,MTU 是英文 Maximum Transmission Unit 的缩写,即最大传输单元,它的单位是字节。 在我们常用的以太网中,MTU 一般是 1500,而无线路由器默认一般是 14...

Clarence_D
33分钟前
1
0
McAfee阻止邮件发送功能

自己写的邮件发送功能,在本地机器上可以发送,但是放到服务器上面之后就不能发送了,捕获到的异常是“以一个访问权限不允许的方式做了一个访问套接字的尝试”,找了很久,终于发现是被McAfe...

壹峰
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部