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方法在方法区中的内存位置,这个指针就是直接引用。
初始化阶段
类的初始化阶段就是对垒中所有变量赋予正确的值,静态变量的赋值和成员变量的赋值都在此完成。初始化的顺序参考上方的整理。
初始化有几点需要注意
如果类还没有被加载和连接,就先进行加载和连接。如果存在直接的父类,父类没有被初始化,则先初始化父类。
jvm的类加载机制总结的更多相关文章
- JVM内存结构 JVM的类加载机制
JVM内存结构: 1.java虚拟机栈:存放的是对象的引用(指针)和局部变量 2.程序计数器:每个线程都有一个程序计数器,跟踪代码运行到哪个位置了 3.堆:对象.数组 4.方法区:字节流(字节码文件) ...
- JVM之类加载机制
JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这 ...
- JVM的类加载机制全面解析
什么是类加载机制 JVM把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制. 如果你对Class文件的结 ...
- 大白话谈JVM的类加载机制
前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢. 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优.垃圾回收机制等等的问题我们才 ...
- 一文教你读懂JVM的类加载机制
Java运行程序又被称为WORA(Write Once Run Anywhere,在任何地方运行只需写入一次),意味着我们程序员小哥哥可以在任何一个系统上开发Java程序,但是却可以在所有系统上畅通运 ...
- JVM的类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的过程: 包括加载.链接(含验证.准备 ...
- 【JVM】类加载机制
原文:[深入Java虚拟机]之四:类加载机制 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 类加 ...
- 深入理解JVM(3)——类加载机制
1.类加载时机 类的整个生命周期包括了:加载( Loading ).验证( Verification ).准备( Preparation ).解析( Resolution ).初始化( Initial ...
- (转) JVM——Java类加载机制总结
背景:对java类的加载机制,一直都是模糊的理解,这篇文章看下来清晰易懂. 转载:http://blog.csdn.net/seu_calvin/article/details/52301541 1. ...
- JVM虚拟机—JVM的类加载机制
1 什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
随机推荐
- Java原来还可以这么学:如何搞定面试中必考的集合类
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...
- [Python] iupdatable包:File模块使用介绍
一.简介 文件模块主要是对常见的文件读写功能进行了封装,默认使用UTF8(utf_8_sig)格式编码,实现一行代码读写文件. 二.简单示例 安装 iupdatable 包 pip install - ...
- 序列化器:ModelSerializer
ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应. ModelSerializer 类与常规 Seri ...
- SpringBoot——Cache使用原理及Redis整合
前言及核心概念介绍 前言 本篇主要介绍SpringBoot2.x 中 Cahe 的原理及几个主要注解,以及整合 Redis 作为缓存的步骤 核心概念 先来看看核心接口的作用及关系图: CachingP ...
- 将xml处理为json对象数组
function xmlStr2js(xmlStr) { var tagNames = xmlStr.match(/<\w+>/g) tagNames = deWeightTagNames ...
- 正则匹配电话号码demo
public static String doFilterTelnum(String sParam) { String result = sParam; if (sParam.length() < ...
- delphi真正实现延时暂停功能
用delphi怎么实现延时功能?在delphi中有一个sleep()函数是用来暂停线程的,使用了它好像和死掉了似得,不好用,这么简单的延时动作用Timer控件有显得复杂了.下面给大家分享一个真正好用的 ...
- C# Linq方式生成SAP对接的XML格式内容(一般处理程序 ashx )
Linq生成XML的方法: string CreateXML(string strkey, string strDATAJSON) { XDeclaration dec = new XDeclarat ...
- 【原创】(六)Linux进程调度-实时调度器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- priority_queue 中存放pair时,自定义排序的写法
struct cmp {template <typename T, typename U> bool operator()(T const &left, U const & ...