jvm的类加载机制总结

类的加载机制分为如下三个阶段:加载,连接,初始化。其中连接又分为三个小阶段:验证,准备,解析。

加载阶段

将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后再堆内创建一个class对象,用来封装类在方法区内的数据结构。

加载class文件的方式:

从本地系统中直接加载

通过网络下载.class文件

从zip,jar等归档文件中加载.class文件

从专有数据库中提取.class文件

将Java源文件动态编译为.class文件

类的加载最终产品是位于堆中的class对象。Class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构和接口。

类加载并不需要等到某个类被主动使用的时候才加载,jvm规范允许类加载器在预料到某个类要被使用的时候就预先加载。如果预先加载过程中报错,类加载器必须在首次主动使用的时候才会报错。如果类一直没有被使用,就不会报错。

验证阶段

此阶段验证的内容如下

类文件的结构检查:

确保类文件遵从java类文件的固定头格式,就像平时做文件上传验证文件头一样。还会验证文件的主次版本号,确保当前class文件的版本号被当前的jvm兼容。验证类的字节流是否完整,根据md5码进行验证。

语义检查:

检查这个类是否存在父类,父类是否合法,是否存在。

检查该类是不是final的,是否被继承了。被final修饰的类是不允许被继承的。

检查该类的方法重载是否合法。

检查类方法翻译后的字节码流是否合法。

引用验证,验证当前类使用的其他类和方法是否能够被顺利找到。

准备阶段

通过验证阶段之后,开始给类的静态变量分配内存,设置默认的初始值。类变量的内存会被分配到方法区中,实例变量会被分配到堆内存中。准备阶段的变量会赋予初始值,但是final类型的会被赋予它的值,可以理解为编译的时候,直接编译成常量赋给。如果是一个int类型的变量会分配给他4个字节的内存空间,并赋予值为0。如果是long会赋予给8个字节,并赋予0。

解析阶段

解析阶段会把类中的符号引用替换成直接引用。比如Worker类的gotoWork方法会引用car类的run方法。

在work类的二进制数据,包含了一个Car类的run的符号引用,由方法的全名和相关描述符组成。解析阶段,java虚拟机会把这个符号引用替换成一个指针,该指针指向car类的run方法在方法区中的内存位置,这个指针就是直接引用。

初始化阶段

类的初始化阶段就是对垒中所有变量赋予正确的值,静态变量的赋值和成员变量的赋值都在此完成。初始化的顺序参考上方的整理。

初始化有几点需要注意

如果类还没有被加载和连接,就先进行加载和连接。如果存在直接的父类,父类没有被初始化,则先初始化父类。

原文地址:https://www.cnblogs.com/jichi/p/12663744.html

时间: 2024-10-11 17:01:33

jvm的类加载机制总结的相关文章

深入JVM之类加载机制

JVM系列 1.深入JVM之源码编译机制 2.深入JVM之类加载机制 3.深入JVM之类执行机制 4.JVM内存诊断工具 总结下类加载机制相关的知识图谱. 转载请注明出处:http://blog.csdn.net/supera_li/article/details/45747329 类加载机制,包括三大步骤. 1.装载load .目的是生成类加载实例id 2.链接 ,检测字节码格式以及内部调用匹配情况.静态变量初始化 3.初始化.主要是类加载器加载类的顺序. 对于自定义类加载,开发者完成自己的实

JVM之类加载机制

JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口.注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类). 验证 这一阶

漫谈JVM之类加载机制(篇一)

前言 最近在看一本书,发现代码里用到了Thread.currentThread().getContextClassLoader(),为什么类加载器还与线程有关系呢,为什么不直接使用ClassLoader.getSystemClassLoader()呢?带着这些疑问又把JVM类加载机制从头到尾学习了一遍. 篇一 类加载时机 我们编写的代码存储在java文件中,java源代码通过编译生成Java虚拟机可识别的字节码,存储在Class文件中.运行java程序时需要将Class文件中的信息加载到Java

JVM的类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的过程: 包括加载.链接(含验证.准备.解析).初始化 如下图所示: 1.加载: 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,作为方法区这个类的数据访问的入口. 也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象.具体包括以下三个部分: (1)通过类的全

(转) JVM——Java类加载机制总结

背景:对java类的加载机制,一直都是模糊的理解,这篇文章看下来清晰易懂. 转载:http://blog.csdn.net/seu_calvin/article/details/52301541 1. 类加载器的组织结构 类加载器 ClassLoader是具有层次结构的,也就是父子关系.其中,Bootstrap是所有类加载器的父亲. (1)Bootstrapclass loader: 启动类加载器 当运行Java虚拟机时,这个类加载器被创建,它负责加载虚拟机的核心类库,如java.lang.*等

JVM类加载机制详解(一)JVM类加载过程

首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值? 5.类加载器是什么? 6.如何编写一个自定义的类加载器? 首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数

Java类加载机制与反射 jvm学习

同一个JVM的有线程.所有变量都处于同一个进程里,他们都使用JVM进程的内存区.当系统出现以下几种情况时JVM进程将被终止: 1.程序运行到最后正常结束 2.程序运行到使用System.exit()或Runtime.getRuntime().exit)代码处结束程序. 3.程序执行过程中遇到未捕获的异常或错误而结束. 4.程序所在平台强制结束了JVM进程 注意两次运行java程序,处于两个不同的JVM他们不共享内存. 类的加载 1.当程序主动使用某个类时,如果该类还未加载到内存中,则系统会通过加

面试必问:JVM类加载机制详细解析

前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是class文件.平常我们写的Java文件,需要编译为class文件才能交给JVM运行.可以这么说:C语言代码——>二进制文件——>计算机硬件,就相当于Java代码——>字节码文件——>JVM.JVM将指定的class文件读取到内存里,并运行该class文件里的Java程序的过程,就称之为类的

jvm之java类加载机制和类加载器(ClassLoader)的详解

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化. 一.类加载过程 1.加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象. 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是前面所有程序运行的基础