类加载的生命周期:

 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载

   

  加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 卸载 这6个阶段顺序是确定的,klass的加载过程一定会按照这个顺序执行。为了支持java的运行时绑定,解析阶段在某些情况下会在初始化之后才进行。

类的初始化阶段

对于加载这个阶段是跟具体的虚拟机实现有关,对于整个类加载阶段最重要的就是初始化这个阶段.

JVM执行初始化的情况

对于Hotspot虚拟机而言,遇见以下这5种情况就需要进行初始化:

遇到 new、getstatic、putstatic、invokestatic,如果类还没进行初始化的时候就进行初始化。生成这4种指令最常见的就是:new一个实例化对象、读取或设置一个类的静态字段(被final修饰、已在编译时吧结果放在常量池的静态字段排除),已经调用一个类的静态方法时。

  • java的反射对类进行反射调用。
  • 初始化类之间,检测父类是否初始化,否则先初始化父类。
  • 虚拟机启动时,用户需要制定一个要执行的主类(包含main方法的类),虚拟机会先初始化这个类
  • 使用jdk7以上动态语言支持时,如果一个methodHandler实例最后的解析结果REF_getstatic、REF_putstatic、REF_invokestatic的方法句柄,并且这个方法的句柄对应的类没有初始化的时候。

  这里我们需要注意的点,上面的五种情况指的是主动的引用方式,除了上面5种主动引用之外的被动引用是不会触发初始化的.

类的被动引用实例:

  情况一:通过子类来引用父类的静态字段,是只会执行父类的初始化而子类不会初始化的,但是Hotspot虚拟机下会触发子类的加载和验证。

  情况二:声明一个数组类型的类。因为jvm会调用newarray生成一个继承自object的子类,这个类代表了对应的这个类型的数组类型。

  情况三:A引用了B中final修饰过的静态属性不会导致B的初始化,因为经过编译器的优化,A中引用的这个B的属性元素已经在编译时期存储到了A类下的常量池中,所以其实A下的引用来自于对自身常量池的引用。

  我们这里还需要注意的一点是接口和类不同的就是接口的父接口只有在真正被使用的时候才会被初始化

类的初始化之clinit方法

  对于jvm而言,类的初始化也就是执行clinit方法,那么什么是clinit方法?

clinit方法是有编译器自动收集类中的所有变量的赋值动作和静态语句块中的语句合并产生的一个用于jvm执行类的初始化的方法。

需要注意以下几点:

  • clinit方法不需要显示的调用父类构造器,虚拟机会保证子类的clinit方法执行之前父类的clinit方法已经调用完毕,因此虚拟机中第一个被执行clinit方法的肯定是Object

  • clinit对于类和接口不是必须的,如果类中没有静态块,也没有对变量的赋值操作,编译器可以不为这个类生产clinit方法。

  • 执行接口的clinit方法不需要先执行父接口的clinit方法,只有当父接口中定义的变量被使用,父接口才会初始化。另外接口的实现类在初始化也一样不会执行接口的clinit方法。

  • jvm会保证一个类的clinit方法在多线程环境下被正确加锁同步,也就是说类的初始化是线程安全的,同时需要注意的是,如果一个线程执行clinit方法时有很耗时的操作,就会阻塞其他也要初始化的这个类的线程。

验证猜想的小技巧

  关于我们文章上述初始化过程中,如何验证,我们可以把代码在写在类的static块里,就能验证我买的猜想了。原理就在上文关于clinit方法中。

Java技术专区-虚拟机系列-类加载机制(类的初始化)的更多相关文章

  1. Java技术专区-虚拟机系列-虚拟机参数(常用)

    基础参数系类(内存分配) -server:一定要作为第一个参数,在多个CPU时性能佳 -Xmn:young generation的heap大小,一般设置为Xmx的3.4分之一-Xms:初始Heap大小 ...

  2. Java技术专区-虚拟机系列-堆快照(获取)

    1.JVM-堆快照(Snapshot) 1.1 输出方式-获取hprof文件 启动参数配置OOM时触发打印堆快照 (1)tomcat启动方式添加参数 (添加环境变量) export JAVA_OPTS ...

  3. java 复习整理(五 类加载机制与对象初始化)

    类加载机制与对象初始化   一 . 类加载机制 类加载机制是指.class文件加载到jvm并形成Class对象的机制.之后应用可对Class对象进行实例化并调用.类加载机制可在运行时动态加载外部的类, ...

  4. Java虚拟机:类加载机制详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 大家知道,我们的Java程序被编译器编译成class文件,在class文件中描述的各种信息,最终都需要加载到虚拟机内存才能运行和使用,那么 ...

  5. java 虚拟机的类加载机制

    Java 虚拟机的类加载机制 关于类加载机制: ​ 虚拟机把描述类的数据从Class 文件加载到内存,并对数据进行效验.转换解析和初始化,最终 形成可以被虚拟机直接使用的Java 类型,就是虚拟机的类 ...

  6. java虚拟机的类加载机制

    引言 我们写的代码是放在.java文件中,经过编译器编译后,转成.class文件.Class文件是一串二进制流,它可以被各平台的虚拟机所接受,实现跨平台.      虚拟机将描述类的数据从class文 ...

  7. 深入理解Java虚拟机(类加载机制)

    文章首发于微信公众号:BaronTalk 上一篇文章我们介绍了「类文件结构」,这一篇我们来看看虚拟机是如何加载类的. 我们的源代码经过编译器编译成字节码之后,最终都需要加载到虚拟机之后才能运行.虚拟机 ...

  8. 【进阶之路】深入理解Java虚拟机的类加载机制(长文)

    我们在参加面试的时候,经常被问到一些关于类加载机制的问题,也都会在面试之前准备的时候背好答案,但是我们是否有去深入了解什么是类加载机制呢?这段时间因为一些事情在家看了些书,这次就和大家分享一些关于Ja ...

  9. 深入理解Java虚拟机之类加载机制篇

    概述 ​ 虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,就是虚拟机的类加载机制. ​ 在Java语言里面,类型的 ...

随机推荐

  1. python基础--冒泡排序

    1.冒泡排序 1.首先用一张图来形象描述一下冒泡排序: 2.废话不多说,直接上代码 # 1.导入随机模块 import random # 2.定义一个列表,列表内的元素为20个100以内的随机整数 l ...

  2. Regular Expression 範例

    Regular expression 被實作於各種語言中,可以用來對字串做 比對 擷取 分隔 這幾類的處理.以下是 JavaScript的處理範例. 各位看官,可以按F12開啟 brower 的 de ...

  3. windows下查看端口占用以及关闭相应的进程

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  4. ogeek babyrop

    拖入ida 先用strncmp使一个随机数与输入比对,这里可以用\x00跳过strncmp 然后read()中的a1是我们输入\x00后的值 写exp from pwn import * sh=rem ...

  5. 微信小程序中new Date()转换时间时间格式时IOS不兼容的问题

    本周写小程序,遇到的一个bug,在chrome上显示得好好的时间,一到Safari/iPhone 就报错 “invalid date”,时间格式为“2019.06.06 13:12:49”,然后利用n ...

  6. MYSQL 查询脚本优化

    业务需要,优化一段多表查询脚本. 总结下来,采取以下步骤. 分析语句 分析语句,了解逻辑,是否可以先优化逻辑. 查询语句的查询范围,是否是全表查询,如果是,尽量优化为按索引查询. 查看语句数量,是否有 ...

  7. ThinkPhp学习

    页面跳转     界面跳转是很常用的操作,所以基于ubuntu16系统,这周学习了ThinkPHP页面跳转和重定向.   页面跳转 系统的Think\Controller类内置了两个页面跳转方法err ...

  8. 将循环结果通过管道 传递给其他命令处理(done |)

  9. RecyclerView跳转到指定位置的三种方式

    自从android5.0推出RecyclerView以后,RecyclerView越来越受广大程序员的热爱了!大家都知道RecyclerView的出现目的是为了替代listview和ScrollVie ...

  10. 记录下通过Java代码打开cmd启动appium server及在使用过程中碰到的问题

    1.appium server启动后,执行测试脚本,appium日志报错,提示appium setting未安装(原因是小米手机在用appium desktop调试时总是提示是否安装appium se ...