一、类的生命周期

  1. 一个类从加载进内存到卸载出内存一共要经历7个阶段:加载—》验证—》准备--》解析—》初始化—》使用—》卸载。
  2. 类加载包括五部分:加载—》验证—》准备--》解析—》初始化
  3. 在类加载的过程中,以下三个过程成为连接:验证—》准备--》解析
  4. 因此,JVM的类加载过程可以分为三个部分:加载—》连接—》初始化
  5. c/c++语言在程序运行之前需要完成预处理、编译、汇编、连接,但是在Java语言中类加载(加载、连接、初始化)是在程序运行期间完成。在程序运行期间完成类加载过程会增加程序的开销,但是随之会带来更大的好处—能够提高程序的灵活性。Java语言的灵活性主要体现在在程序运行期间能够动态的扩展,所谓的动态扩展就是动态加载和动态链接。

二、类加载的时机

  1. 类加载过程中每个步骤的顺序

a)        加载、验证、准备、初始化是按照先后顺序依次执行的

b)        解析过程会发生在初始化过程中

  1. 类加载过程中“初始化”开始的时机:JVM规范中只定义了类加载过程中初始化过程开始的时机,加载、连接过程都应该在初始化之前开始(解析除外)

a)        在类加载过程中遇到如下指令(new、getstatic、putstatic、invokestatic),如果当前的类尚未初始化,那么就要进行初始化。分别对应的Java代码场景为:

  1. 通过new创建一个对象
  2. 读取、设置一个类的静态成员变量(final修饰的成员变量除外)
  3. 调用一个类的静态成员函数

b)        使用Java.lang.reflect进行发射调用的时候,如果这个类没有被初始化,那么就要先进行初始化

c)        当初始化一个类时,如果这个类的父类还没有被初始化,那么先初始化这个类的父类,再初始化这个类

d)        当虚拟机启动的时候,虚拟机会首先初始化带有main方法的类

  1. 主动引用和被动引用

JVM虚拟机规范中要求在程序运行过程中,“当且仅当”出现上述4个条件之一的情况才会初始化一个类。如果间接满足上述初始化条件是不会初始化类的。其中,直接满足上述初始化条件的情况叫做主动引用;间接满足上述初始化过程的情况叫做被动引用。

那么,只有当程序在运行过程中满足主动引用的时候才会初始化一个类,若满足被动引用就不会初始化一个类。

  1. 接口的初始化和类的初始化比较和区别

类和接口都需要初始化,他们初始化的过程大致相同,不同点在于:类初始化过程中如果发现该类的父类尚未被初始化,那么会先初始化父类,然后再初始化这个类;但是接口初始化的时候,并不要求父类已经全部初始化,当程序运行过程中需要用到父类的东西的时候在初始化父类接口。

深入理解JVM(8)——类加载的时机的更多相关文章

  1. 深入理解JVM之类加载

    ---title: [学习]深入理解JVM之类加载.mddate: 2019-10-20 22:20:06tags: JVM 类加载--- Java类的加载,连接,初始化都是在程序运行期间执行的 ## ...

  2. 【深入理解JVM】类加载器与双亲委派模型 (转)

    出处: [深入理解JVM]类加载器与双亲委派模型 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过 ...

  3. 深入理解JVM - 虚拟机类加载机制 - 第七章

    类加载的时机类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括了:加载/验证/准备/解析/初始化/使用/卸载七个阶段.其中验证/准备和解析统称为连接(Linking). 加载.验证.准 ...

  4. 深入理解JVM的类加载

    前言: 前面又说到Java程序实际上是将.class文件放入JVM中运行.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的Java类 ...

  5. 深入理解JVM(3)——类加载机制

    1.类加载时机 类的整个生命周期包括了:加载( Loading ).验证( Verification ).准备( Preparation ).解析( Resolution ).初始化( Initial ...

  6. 【深入理解JVM】类加载器与双亲委派模型

    原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...

  7. 深入理解JVM一类加载器原理

    我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的 ...

  8. 深入理解JVM,类加载器

    虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称 ...

  9. 理解JVM之类加载机制

    类完整的生命周期包括加载,验证,准备,解析,初始化,使用,卸载,七个阶段.其中验证,准备,解析统称为连接,类的卸载在前面的关于垃圾回收的博文中已经介绍. 加载,验证,准备,初始化,卸载这五个阶段的顺序 ...

  10. JVM(二)类加载的时机及其过程

    类从被加载到虚拟机内存中开始,到卸载出内存为止,它的的整个生命周期包括: 加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化 ...

随机推荐

  1. asp.net core WebApi 快速入门

    参考:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.1 官网的例子 直接 ...

  2. Senparc.Weixin微信开发(2) 消息机制和上下文(Session)

    了解MessageHandler 为项目添加一个CustomMessageHandle.cs类 public class CustomMessageHandler : MessageHandler&l ...

  3. Go语言之函数签名

    使用type关键字进行, 函数类型变量也可以作为函数的参数或返回值. 我觉得属于高级技巧了,初学者可能需要很多代码实现的, 高级的就可以更通用的实现. package main import &quo ...

  4. ASP.NET Core IHostEnvironment和IApplicationLifetime介绍

    IHostEnvironment获取程序信息 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app ...

  5. MVC区域area

    1.当项目业务比较庞大,可以通过区域来分拆. 2.添加区域时,默认会生成一下文件. 3.Application_Start()必需含有AreaRegistration.RegisterAllAreas ...

  6. Visual Studio "14" CTPs

    下载地址:http://www.visualstudio.com/en-us/downloads/visual-studio-14-ctp-vs       上张有亮点的图: 实现亮点的方法(Remo ...

  7. 第k个互质数(二分 + 容斥)

    描述两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的数按照升序排列. 输入 输入m ,k (1<=m<=1000000;1<= ...

  8. 【转】通过 INotifyPropertyChanged 实现观察者模式

    通过 INotifyPropertyChanged 实现观察者模式 原博客地址 http://frankdzu.blog.sohu.com/117654536.html 普通观察者模式存在的问题 我们 ...

  9. Nginx编译安装:

    第三方模块 在nginx.org   --------  wiki  找 --add-module=   添加 Nginx编译安装: 安装开发环境 ]# yum groupinstall " ...

  10. AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)

    原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-SoundHound-Inc-Programming-Contest-2018-E.html 题目 ...