05JVM_类加载阶段

这篇具有很好参考价值的文章主要介绍了05JVM_类加载阶段。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、类加载阶段

05JVM_类加载阶段,JVM,java,开发语言,jvm

1.加载

1.1介绍

①Java源代码经编译生成字节码文件,通过类加载阶段将字节码载入方法区

②类加载阶段内部是C++的instanceKlass描述java类,重要的域field有:

_java_mirror,java类镜像。例如对String来说,就是String.class,作用把klass暴露给java使用。【桥梁】
_super 父类
_fields 成员变量
_methods 方法
_constants 常量池
_class_loader 类加载器
_vtable 虚方法表
_itable 接口方法表

③类有父类,先加载父类。

④加载和链接可能交替运行

1.2注意

①加载的类在JVM创建相应的类结构instanceKlass的元数据存储在方法区(jdk1.8在元空间内),但_java_mirror的java类镜像存储在堆中。

②将.class文件加载到元空间后,会在堆中创建一个java.lang.Class对象。该Class对象在加载类的过程创建的,每个类都有一个Class类型的对象。

③外部通过访问Person类的Class对象获取Person的类数据结构。通过class类提供的接口,可以获得目标类所关联的.class文件的具体数据结构:方法、字段信息。

05JVM_类加载阶段,JVM,java,开发语言,jvm

【图解】

加载到方法区的元空间类的字节码加载到元空间构成instanceKlass数据结构,并在内存生成_java_mirror的java类镜像Person.class类对象

②当new创建Person的实例对象。每个实例的对象头存储对应着class地址。通过这个地class地址就能找到Person.class类对象,然后间接的在元空间找到instanceKlass,来获取Person类的方法,字段信息。

2.链接

链接的三阶段

验证,准备,解析。

2.1链接-验证

1.验证的目的

验证是否符合JVM规范,进行安全性检查。

2.1链接-准备

①为static静态变量分配空间,设置默认值。

②jdk1.8后静态变量存放在空间类对象后面

③早期jdk6之前的静态变量存放在instanceKlass后面,存放方法区。

05JVM_类加载阶段,JVM,java,开发语言,jvm

④static变量分配空间在准备阶段完成,赋值在初始化阶段完成

⑤static final基本类型变量。分配空间,赋值在准备阶段。如果是引用类型,赋值在初始化。

2.1链接-解析

解析的含义:

将常量池的符号引用解析为直接引用。得到类,字段,方法在内存中的地址。

3.初始化

给类中声明的静态变量初始化赋值

3.1<cinit>()V方法

初始化调用<cinit>()V,虚拟机保证这个类的构造方法的线程安全。

3.2发生的时机

类初始化是懒惰的

类的初始化

main方法所在的类,首先初始化。作为程序的入口

②首次访问这个类的静态变量或静态方法

子类初始化,如果父类没初始化,会引发父类初始化

④子类访问父类的静态变量,只有父类初始化

⑤反射,Class.forName

⑥new会导致初始化

类不能初始化

①访问类的static final 静态常量(基本类型和字符串)不会类的初始化。(准备阶段完成了)

②类对象.class不会触发初始化

③创建类的数组不会触发初始化

④类加载器的loadClass方法,只会加载,不会解析和初始化。

⑤Class.forName的参数2为false

练习

1.从字节码分析,使用a,b,c这三个常量是否会导致E初始化

05JVM_类加载阶段,JVM,java,开发语言,jvm

E.a ,E.b不会,这是static final基本类型变量。赋值在准备阶段

E.c 会,static final引用类型变量,赋值要初始化

2.完成懒惰初始化单例模式

05JVM_类加载阶段,JVM,java,开发语言,jvm

 懒惰实例化,初始化线程安全有保障。文章来源地址https://www.toymoban.com/news/detail-709520.html

到了这里,关于05JVM_类加载阶段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [JVM] Java类的加载过程

    在Java中,类的加载是指在程序运行时将类的二进制数据加载到内存中,并转化为可以被JVM执行的形式的过程。类的加载过程主要包括以下几个步骤: 加载 (Loading):通过类的全限定名,使用类加载器将类的二进制数据加载到JVM中。类加载器会根据类的名称找到对应的字节码

    2024年01月16日
    浏览(36)
  • 【Jvm】Java类加载机制是什么?

    什么是类的加载? 类的生命周期? 类加载器是什么? 双亲委派机制是什么? JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.Class 对象,作为方法区类数

    2024年02月11日
    浏览(41)
  • JVM 虚拟机 ----> Java 类加载机制

    一、概述 类是在运行期间第一次使用时,被类加载器动态加载至 JVM 。JVM不会一次性加载所有类。因为如果一次性加载,那么会占用很多的内存 二、类的生命周期 类的生命周期包含以下 七 个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化

    2024年02月07日
    浏览(41)
  • 【JAVA基础】JVM之类加载--双亲委派机制

    1. 类加载的过程 描述: 我们写的 .java 文件通过编译成字节码文件 .class 文件,然后再通过我们的类加载器:Class Loader,反射以后,类模板存在方法区,把实例化的对象存在堆里; 看图: 对象的hashcode值 解释: 从图中我们可以看出,从同一个类模板new出来三个对象(实例化

    2024年01月23日
    浏览(45)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(91)
  • 【Java】JVM执行流程、类加载过程和垃圾回收机制

    JVM,就是Java虚拟机,Java的的程序都是运行在JVM当中。 程序在执行之前先要把java源代码转换成字节码(class文件),JVM 首先需要把字节码通过一定的方(类加载器(ClassLoader)) 把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是 JVM 的一套指令集规范,并

    2024年02月16日
    浏览(50)
  • JVM类加载器大比拼:谁才是Java程序的真正主宰?

    主页传送门:📀 传送   JVM(Java虚拟机)的类加载器是Java的核心组件之一,负责将Java字节码文件加载到JVM中,并将其转换为可以执行的Java类。 类加载器的主要职责: 加载类:根据类的全限定名,将类的字节码文件加载到JVM中,并为其创建一个Class对象。 链接类:验证类

    2024年02月08日
    浏览(31)
  • Java安全——JVM类加载器(1),啃下这些Framework技术笔记

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新网络安全全套学习资料》

    2024年04月29日
    浏览(36)
  • Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    1.java运行时的内存分配,创建对象时内存分配; 2.类加载的顺序,创建一个唯一的类的类对象; 3.创建对象的方式,new,Class.forName,clone; 4.什么时候加载.class文件进入JVM内存中,看到new,Class.forName; 5.如何加载?双亲委托(委派)机制:安全;AppClassLoader; 6.反射实质:能

    2024年02月14日
    浏览(44)
  • 2023-08-05——JVM 栈

    栈:数据结构 程序=数据结构+算法 栈:先进后出,后进先出 好比一个:桶 队列:先进先出(FIFO :First Input First Out) 好比一个:管道 栈:喝多了吐。队列:吃多了拉 栈:栈内存,主程序的运行,生命周期和线程同步 线程结束,栈内存也就释放了,对于栈来说不存在垃圾释

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包