类的生命周期

综述

1.    只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算)

2.    若在加载一个类的过程中,有其他类被切实使用到,则会被一同级联加载到JVM中。

3.    当一个类中的某个符号被第一次使用到时,该类才会被初始化;当类被加载时,它并未被初始化。

4.    初始化顺序:

静态函数/变量初始化(Textual Order)

实例成员变量初始化

构造函数

加载(Loading)

1)类加载器通过类的全限定名来获取定义此类的二进制字节流

2)字节流-> 方法区运行时数据结构

3)在方法区生成java.lang.Class 对象 (作为这个类在方法区的入口)

验证 (Verification)

确保Class字节流中包含的信息符合当前JVM的要求,且不会危害虚拟机安全

1)文件格式验证 (验证字节流是否符合Class文件格式规范)

2)元数据验证(对元数据进行语义校验,确保符合Java语法)

3)字节码验证(对类的方法体进行校验,确保符合语义和逻辑)

4)符合引用验证(对类中的符号引用进行校验,以确保解析动作可正常执行)

准备(Preparation)

为类变量的静态字段在方法区分配内存并设置零值的阶段

1.   进行内存分配的对象仅包括类变量的static字段

2.  初始化的为变量的零值,而非默认值

解析(Resolution)

JVM将常量池内的符号引用替换为直接引用的过程,包括

类/接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符

初始化(Initialization)

执行<clinit>()方法的过程

1.     <clinit>()方法是由类变量的赋值动作和static语句块合并产生的;合并后的顺序即自然语句顺序(Textual Order);static语句块只能访问定义在该语句块之前的变量,定义在其后的变量只能赋值,不能访问。

2.     JVM自动在子类<clinit>()方法执行之前,先执行父类<clinit>()方法

3.    若类中没有静态语句块,也没有对变量的赋值操作,则compiler可以不生成<clinit>()方法

4.    执行接口的<clinit>()方法前不需要先执行父接口的<clinit>()方法,当需要使用到父接口定义的变量时,再行初始化。

5.    接口的实现类在初始化时不会执行父接口<clinit>()方法

6.    JVM保证一个类的<clinit>()方法运行时是线程安全的;但是如果执行<clinit>()的线程退出该方法,其它线程被唤醒后不会再进入<clinit>(),即:一个类加载器下,每个类型只会被初始化一次。

Reference:

https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html#9766

http://www.programcreek.com/2013/01/when-and-how-a-java-class-is-loaded-and-initialized/

http://www.programcreek.com/2011/10/java-class-instance-initializers/

http://stackoverflow.com/questions/7560721/when-does-the-jvm-load-classes

JVM:类的生命周期的更多相关文章

  1. JVM 类的生命周期、类加载器

    类的加载.连接与初始化                  • 1. 加载:查找并加载类的二进制数据         • 2. 连接             – 2.1 验证:确保被加载的类的正确性   ...

  2. Java - JVM - 类的生命周期

    概述 简述 JVM 里 类的生命周期 上次写了 30%, 居然丢了 难受, 又要重新写 类的生命周期 加载 使用 卸载 1. 加载 概述 类型的加载 大体流程 装载 连接 验证 准备 解析(可选的) ...

  3. JVM类加载器及Java类的生命周期

    预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar) ...

  4. JVM与垃圾回收机制(GC)和类的生命周期

    JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...

  5. <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  6. Java类的生命周期详解

    引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...

  7. 【转】Java 类的生命周期详解

    一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...

  8. 【转载】详解java类的生命周期

    原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...

  9. [Java]类的生命周期(上)类的加载和连接[转]

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...

随机推荐

  1. 【SQL.基础构建-第二节(2/4)】

    --      Tips:查询基础 --一.SELECT 语句基础-- 1.查询指定列:SELECT 关键字--语法:--SELECT <列名>, ...     -- 希望查询列的名称- ...

  2. NodeJS技巧

    1. 获取程序执行时间 // 打印程序执行时间 console.time() // some functions console.timeEnd() 2. 将函数异步化 setTimeout(() = ...

  3. Baidu音乐爬虫

    Baidu音乐歌曲爬虫: 1.分析Baidu音乐歌曲下载接口,组装参数 2.判断是否需要登录 a.使用cookie b.使用selenium 3.歌曲信息页面分析 4.数据表设计 歌曲类型表 歌曲表 ...

  4. [LeetCode] Construct the Rectangle 构建矩形

    For a web developer, it is very important to know how to design a web page's size. So, given a speci ...

  5. 接口自动化测试:python+json+requests+数据驱动

    接口测试是单元测试的一个子集,但又不等同于单元测试.从测试的角度来看,接口测试的价值在于其测试投入比单元测试少,而且技术难度也比单元测试小.一般来说,接口测试的粒度要比单元测试更粗,它主要是基于子系统 ...

  6. 机器学习技法:04 Soft-Margin Support Vector Machine

    Roadmap Motivation and Primal Problem Dual Problem Messages behind Soft-Margin SVM Model Selection S ...

  7. python 网路爬虫(二) 爬取淘宝里的手机报价并以价格排序

    今天要写的是之前写过的一个程序,然后把它整理下,巩固下知识点,并对之前的代码进行一些改进. 今天要爬取的是淘宝里的关于手机的报价的信息,并按照自己想要价格来筛选. 要是有什么问题希望大佬能指出我的错误 ...

  8. [ZJOI 2006]超级麻将

    Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的牌有ai ...

  9. [USACO14DEC]驮运Piggy Back

    题目描述 Bessie 和 Elsie在不同的区域放牧,他们希望花费最小的能量返回谷仓.从一个区域走到一个相连区域,Bessie要花费B单位的能量,Elsie要花费E单位的能量. 如果某次他们两走到同 ...

  10. Evensgn 的债务

    问题 A: Evensgn 的债务 大致题意:a欠b5元,b欠c5元,那么最小债务总额为a欠c5元,给你关系,求最小债务总额! 不想说话...一句超级大水题,我居然没读懂!!差点想到网络流了...其实 ...