开始阶段

装载:把二进制形式的java类型读入jvm中。

1)通过该类型的完全限定名,产生一个代表该类型的二进制数据流;
2)解析这个二进制数据流为方法区内的内部数据结构;
3)创建一个表示该类型的java.lang.Class类的实例;

连接:把已读入的类型数据合并到虚拟机的运行时状态中。

1)验证:确保java类型数据格式正确并且适用于jvm使用;
2)准备:为该类型分配内存;
3)解析:把常量池中的符号引用转换为直接引用;

初始化:每个类和接口在首次主动使用时初始化。为类变量赋予正确的初始值;

1)如果类存在直接超类,且直接超类没有被初始化,先初始化直接超类;
2)如果类存在初始化方法,就执行此方法;

只有六种活动被认为是主动使用:

1)、创建类的新实例
2)、调用类中声明的静态方法
3)、操作类或者接口中声明的非常量静态字段
4)、调用Java API中特定的反射方法
5)、初始化一个类的子类
6)、指定一个类作为jvm启动时的初始化类

使用阶段(绝大部分时间)

实例化

实例化途径

明确实例化一个类的四种途径:
1)、new操作符;
2)、调用Class或者Java.lang.reflect.Constructor对象的newInstance()方法;
3)、调用任何现有对象的Clone()方法;
4)、通过java.io.ObjectInputStream类的getObject()方法反序列化;

隐含实例化的几种途径:
1)、保存命令行参数的String对象;
2)、和类装载相关,jvm装载的每一个类型,会暗中实例化一个Class对象来代表这个类型;
3)、和类装载相关,当jvm装载了在常量池中包含CONSTANT_String_info入口类的时候,会创建新的String对象的实例来表示这些常量字符串;
4)、通过执行包含字符串连接操作符的表达式产生对象;

实例化步骤

1)、在堆中为保存对象的实例变量分配内存;
2)、为实例变量初始化为默认的初始值;
3)、为实例变量赋正确的初始值,有三种技术完成赋值:
  a)、如果对象是clone() 创建的,jvm把原实例变量中的值拷贝到新对象中;
  b)、如果是通过ObjectInputStream类的readObject()调用反序列化的,jvm从输入流中读取的值来初始化实例变量;
  c)、jvm调用对象的实例化方法把对象的实例变量初始化为正确的初始值;

垃圾收集和对象终结

jvm实现必须具有某种自动堆存储管理策略,大部分是使用垃圾收集器。如果类声明了 void finalize()方法,垃圾收集器在释放实例内存前会执行这个方法。
垃圾收集器自动调用的finalize()方法抛出的任何异常都将被忽略。

结束阶段

从jvm中卸载类型

很多情况,jvm中类的生命周期和对象的生命周期很相似。jvm如何判断动态装载的类型是否仍然被程序使用,其判断方式和判断对象是否仍然被使用很相似。
如果程序不再引用某类型,那么类型就是不可触及的,就可以被卸载。
使用启动类装载器装载的类型永远都是可触及的,所以永远不会被卸载。只有使用用户定义的类装载器装载的类型才会变成不可触及,才会被卸载。

整理自《深入Java虚拟机第二版》

java类型生命周期的更多相关文章

  1. java类生命周期详细解析

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

  2. java对象生命周期概述复习

    最近看了下java对象的生命周期做个笔记复习复习,很多不同的原因会使一个java类被初始化,可能造成类初始化的操作: 1)  创建一个java类的实例对象. 2)  调用一个java类中的静态方法. ...

  3. java类生命周期,类的“加载,连接,初始化,使用,卸载过程”详解

    “ 如果说核心类库的 API 比做数学公式的话,那么 Java 虚拟机的知识就好比公式的推导过程” 每本Java入门书籍在介绍Java这门语言的时候都会提到Java跨平台,“一次解释,到处运行的特点“ ...

  4. Java实现生命周期管理机制

    先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然 ...

  5. Java线程生命周期

    当你需要使用Java线程在多线程环境下进行编程时,理解Java的线程周期与线程的状态是非常重要的.通过实现Runnale接口或者继承Thread类,我们可以创建线程,为了启动一个线程,我们需要创建一个 ...

  6. Java 线程生命周期

    |作者:RexFang |出处:http://www.cnblogs.com/rexfang/ |关于作者:Java 程序员一枚 |版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此 ...

  7. Java线程生命周期与状态切换

    前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...

  8. Java初始化生命周期

    package com.init; abstract class Glyph { void draw() { System.out.println("Glyph.draw()"); ...

  9. java线程生命周期及其对应方法

    http://blog.sina.com.cn/s/blog_a8aa82cc0101ktrm.html http://wenku.baidu.com/view/c242df69011ca300a6c ...

随机推荐

  1. BOM下的属性和方法---下

    继续BOM下的属性和方法---上 代码示例(亲测)2:   <title>location对象的属性</title> <script> //服务器环境我再此次演示中 ...

  2. 怎样在win7 IIS中部署网站?

    IIS作为微软web服务器的平台,可以轻松的部署网站,让网站轻而易举的搭建成功,那么如何在IIS中部署一个网站呢,下面就跟小编一起学习一下吧. 第一步:发布IIS文件 1:发布你所要在IIS上部署的网 ...

  3. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)

    一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object): pass _registry = { Foo:123 } print(_registry) 执行输出: {&l ...

  4. 《剑指offer》-递增数组中找到和为S的(最小)两个元素

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 首先 ...

  5. POJ 1065 Wooden Sticks【贪心】

    题意: 有一些木棍,每个有长度和重量,要求把这些木棍排成若干两个属性值均不下降的序列.问至少要分为多少个序列.且要保证排出来的子序列数最少. 思路: ( 9 , 4 ) ,( 2 , 5 ) ,( 1 ...

  6. linux下安装openoffice

    一.环境 centos6.9 安装jdk1.6及以上 二.安装依赖 yum install libXext.x86_64 -y yum install freetype -y yum groupins ...

  7. docker容器中安装vim 、telnet、ifconfig, ping命令

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim命令时 ...

  8. Burp Suite之爬网模块(二)

    Spider功能 Burp Spider爬网介绍 Burp Spider 是一个映射 web 应用程序的工具.它使用多种智能技术对一个应用程序的内容和功能进行全面的清查. 通过跟踪 HTML 和 Ja ...

  9. Java开发人员必须掌握的两个Linux魔法工具(四)

    子曰:"工欲善其事,必先利其器." 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 学习应该是快乐的,在这个乐园中我努力让自己能用简洁易懂(搞笑有趣) ...

  10. pojA Star not a Tree?

    题目链接 pojA Star not a Tree? 题解 啊,模拟退火是个好东西 模拟退火即可 代码 #include<cmath> #include<cstdio> #in ...