开始阶段

装载:把二进制形式的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. ubuntu 窗口操作快捷键

    alt + space 打开窗口菜单SUPER + A: 搜索或浏览程序 SUPER/alt + tab: 切换窗口 SUPER + L: 进入睡眠状态 SUPER + M:查看日历

  2. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个Sq ...

  3. Swagger 常用注解

    一.Swagger常用注解 1.与模型相关的注解 两个注解: @ApiModel:用在模型类上,对模型类做注释: @ApiModelProperty:用在属性上,对属性做注释 2.与接口相关的注解 六 ...

  4. 6-14 Abbott的复仇 uva816

    我的第一题bfs 将方向固定  NESW  然后左转和右转就是+3和+1!!! 还有就是  建立一个数组 储存父节点  这样就可以往回打印出路径   打印的截至条件是 d[][][]==0时  说明到 ...

  5. 015 在Spark中关于groupByKey与reduceByKey的区别

    1.groupByKey的源代码 2.groupByKey的使用缺点 不使用groupByKey的主要原因:在大规模的数据下,数据分布不均匀的情况下,可能导致OOM 3.reduceByKey的源代码 ...

  6. 090实战 Hadoop离线项目介绍(不包括程序)

    一:项目场景 1.需求分析 根据用户行为数据进行程序的处理,得到结果保存到关系型数据库中 需要收集用户(系统使用者)在不同客户端上产生的用户行为数据,最终保存到hdfs上 需要明确收集字段的相关信息, ...

  7. Python 豆瓣源

    国内的pythoner强烈建议使用豆瓣的pypi源 https://pypi.douban.com/simple/ sudo pip install -i https://pypi.douban.co ...

  8. Tkinter的下拉列表Combobox

    Tkinter的下拉列表Combobox   tk中下拉列表使用ttk.Combobox,代码如下:   #!/usr/bin/env python   # -*- coding: utf-8 -*- ...

  9. mac下配置Apache虚拟域名方案,以及遇到的坑(转)

      1. 配置Apache虚拟域名 1.执行    sudo vi /etc/apache2/httpd.conf 开始配置httpd.conf 的文件; //配置listen 80端口(默认配置), ...

  10. 洛谷 P1571 眼红的Medusa【二分查找】 || 【map】

    题目链接:https://www.luogu.org/problemnew/show/P1571 题目描述 虽然Miss Medusa到了北京,领了科技创新奖,但是他还是觉得不满意.原因是,他发现很多 ...