深入理解JVM-类加载初始化阶段-类的主动与被动引用
JVM的类加载阶段中初始化阶段 P210
虚拟机规定的五种情况必须对类的“初始化”情况
1.遇到new、getstatic、putstatic、或invokestic 四条字节码指令时,如果类没有经过初始化,则需要先触发使其初始化,生成这四条指令的最常见的java代码场景时:使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final修饰,已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。
2.使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化则需要先触发其初始化。
3.当初始化一个类的时候,入宫发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
4.当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
5.当使用JDK7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化。
这五种情况属于------对一个类进行主动引用。
除此之外,所有引用类的方式都不会触发初始化,成为被动引用
一、通过子类引用父类的静态字段,不会导致字类初始化
public class SuperClass {
public class SubClass extends SuperClass {
public class InitTest {
可以打印出类的加载顺序,可以用来排查 class 的冲突问题: -XX:+TraceClassLoading |
二、通过数组定义来引用类,不会触发此类的初始化
public static void main(String[] args) {
|

三、常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量类的初始化
public class ConstClass {
public static void main3(String[] args) {
|
ps:
调用 javap -c xx.class查看字节码 <https://www.jianshu.com/p/6a8997560b05>
字节码大全 <https://www.cnblogs.com/longjee/p/8675771.html>
深入理解JVM-类加载初始化阶段-类的主动与被动引用的更多相关文章
- 深入理解JVM虚拟机6:深入理解JVM类加载机制
深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...
- 理解JVM——类加载机制
我们在编写Java程序之后,会通过编译器得到一个class文件,这个class文件是如何与JVM进行配合的呢?类中的信息是如何变成JVM可以使用的Java类型呢?这些都是类加载机制做到的. 虚拟机把描 ...
- JVM类加载机制以及类缓存问题的处理
一:JVM类加载机制 和 类缓存问题的处理 当一个java项目启动的时候,JVM会找到main方法,根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载(其步骤分为加载.验 ...
- 【深入理解JVM】:Java类继承关系中的初始化顺序
尝试着仔细阅读thinking in java 看到一篇很好的文章http://blog.csdn.net/u011080472/article/details/51330114
- 深入理解JVM类加载机制
1.什么是类加载机制? JVM把class文件加载到内存里面,并对数据进行验证.准备.解析和初始化,最终能够被形成被JVM可以直接使用的Java类型的过程. 生命周期包含:加载,验证,准备,解析,初始 ...
- 深入理解JVM类加载机制 classloader
转自https://www.cnblogs.com/ygj0930/p/6536048.html
- [Java] 理解JVM之二:类加载步骤及内存分配
一.类加载器 ClassLoader 能根据需要将 class 文件加载到 JVM 中,它使用双亲委托模型,在加载类的时候会判断如果类未被自己加载过,就优先让父加载器加载.另外在使用 instance ...
- JVM基础系列第7讲:JVM 类加载机制
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...
- JVM类加载机制一
类加载的过程 什么是类加载?Java编译器会将我们编写好的代码编译成class字节码文件,JVM会把这些class字节码文件加载到内存中,并对加载的数据进行校验.准备.解析并初始化,这个过程就是类加载 ...
随机推荐
- JSON.stringify & JSON.parse 简析
以前用到JSON的场景也不少,但是没有仔细的研究过,这几天趁着一个需求用到了,就整理了一下相关用法. 一. JSON.stringify() 1. 语法 JSON.stringify(value[, ...
- java--static与代码块
static与代码块: static class Student{ static String school; // 随着类的加载而执行 可以由类进行调用 static { // 静态代码块 加载类时 ...
- js 实现watch监听数据变化
1.js /** * @desc 属性改变监听,属性被set时出发watch的方法,类似vue的watch * @author Jason * @study https://www.jianshu.c ...
- SharePoint Rest Api Caml multiple condition query -Rest api 利用Caml多个条件查询
$.ajax({ var cquery="<View><Query><Where><And><Geq><FieldRef N ...
- java mail 封装工具类使用
直接上代码 配置QQ邮箱的IMAP 进入qq电子邮件点击 设置->账户里开启 SMTP 服务(开启IMAP/SMTP服务) 注意:在启用QQ邮箱的14天之后才能开启此服务 创建Sendmail ...
- leetcode 学习心得 (4)
645. Set Mismatch The set S originally contains numbers from 1 to n. But unfortunately, due to the d ...
- TP5.0整合webuploader实现多图片上传功能
在https://github.com/fex-team/webuploader 下载webuploader并解压,解压后放到public里面.其中我把解压缩后的文件夹改名为webuploader,放 ...
- Makefile 基础语法
1.. specify the directores , i not specified , search current directory put every folder into a list ...
- Mysql数据库之备份还原(mysqldump,LVM快照,select备份,xtrabackup)
备份类型: 热备份:读写不受影响 温备份:仅可执行读备份 冷备份:离线备份,读写均不能执行,关机备份 物理备份和逻辑备份 物理备份:复制数据文件,速度快. 逻辑备份:将数据导出之文本文件中,必要时候, ...
- Nginx 核心配置-新建一个web站点
Nginx 核心配置-新建一个web站点 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx基础配置常用参数说明 [root@node101.yinzhengjie.or ...
