java类的生命周期

标签: java类的生命周期
22人阅读 评论(0) 收藏 举报
分类:

如图:

1.加载 
我们编写一个java的源文件,经过编译后生成一个后缀名为.class的文件,这结合四字节码文件,
java虚拟机就识别这种文件,java的生命周期就是class文件从加载到消亡的过程。 
关于加载,其实,就是将源文件的class文件找到类的信息将其加载到方法区中,
然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。
但是这一功能是在JVM之外实现的,主要的原因是方便让应用程序自己决定如何获取这个类,
在不同的虚拟机实现的方式不一定相同,hotspot虚拟机是采用需要时在加载的方式,
也有其他是先预先加载的。 
2.连接 
一般会跟加载阶段和初始化阶段交叉进行,过程由三部分组成:验证、准备和解析三步 
(1)验证:确定该类是否符合java语言的规范,有没有属性和行为的重复,继承是否合理,总之,就是保证jvm能够执行 
(2)准备:主要做的就是为由static修饰的成员变量分配内存,并设置默认的初始值 
默认初始值如下:

1.八种基本数据类型默认的初始值是0 
2.引用类型默认的初始值是null 
3.有static final修饰的会直接赋值,例如:static final int x=10;则默认就是10.
(3)解析:这一阶段的任务就是把常量池中的符号引用转换为直接引用,说白了就是jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址。 
3.初始化 
这个阶段就是将静态变量(类变量)赋值的过程,即只有static修饰的才能被初始化,执行的顺序就是:

父类静态域或着静态代码块,然后是子类静态域或者子类静态代码块
4.使用 
在类的使用过程中依然存在三步:对象实例化、垃圾收集、对象终结

(1)对象实例化:就是执行类中构造函数的内容,如果该类存在父类JVM会通过显示或者隐示的方式先执行父类的构造函数,在堆内存中为父类的实例变量开辟空间,并赋予默认的初始值,然后在根据构造函数的代码内容将真正的值赋予实例变量本身,然后,引用变量获取对象的首地址,通过操作对象来调用实例变量和方法 
(2)垃圾收集:当对象不再被引用的时候,就会被虚拟机标上特别的垃圾记号,在堆中等待GC回收 
(3)对象的终结:对象被GC回收后,对象就不再存在,对象的生命也就走到了尽头
5.类卸载 
即类的生命周期走到了最后一步,程序中不再有该类的引用,该类也就会被JVM执行垃圾回收,从此生命结束…

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.etc.test;
class A{
    static int a;//类变量
    String name;
    int id;
    //静态代码块
    static{
        a=10;
        System.out.println("这是父类的静态代码块"+a);
    }
    //构造代码块
    {
        id=11;
        System.out.println("这是父类的构造代码块id:"+id);
    }
    A(){
        System.out.println("这是父类的无参构造函数");
    }
    A(String name){
        System.out.println("这是父类的name"+name);
    }
}
class B extends A{
    String name;
    static int b;
    static{
        b=12;
        System.out.println("这是子类的静态代码块"+b);
    }
     B(String name) {
        super();
        this.name = name;
        System.out.println("这是子类的name:"+name);
    }
}
public class Test666 {
public static void main(String[] args) {
    B bb=new B("GG");
}
}

  

输出的结果如下:

这是父类的静态代码块10
这是子类的静态代码块12
这是父类的构造代码块id:11
这是父类的无参构造函数
这是子类的name:GG

查看评论

java虚拟机-类生命周期

类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过...
  • wwwxxdddx
  • wwwxxdddx
  • 2015-07-08 16:08:02
  • 832

Java 类的生命周期

先了解下JAVA堆栈 JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(cl...
  • songjinbin
  • songjinbin
  • 2014-02-17 13:36:39
  • 1468

Java 对象生命周期和类生命周期

Java 对象生命周期 在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶...
  • huangzhen0914
  • huangzhen0914
  • 2015-04-21 16:57:30
  • 5009

深入理解java 类在jvm中的生命周期

**深入理解java 类在jvm中的生命周期**一、理解java程序的在java虚拟机中的生命周期(一)加载(二)连接 1.验证 2.准备 3.解析 (三)初始化 (四)卸载...
  • yinbingqiu
  • yinbingqiu
  • 2016-10-25 20:27:28
  • 546

详谈java类和对象的生命周期

引言         最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内jav...
  • qq_16485855
  • qq_16485855
  • 2016-09-19 14:20:43
  • 1091

java static域 生命周期

1、http://zhidao.baidu.com/link?url=sJ7VSC7Fn5uXm_ZvFvw4Ojf4WuklG-s6iROk3GuJKrOMexWNDOFHa5tQsftHtVoOO...
  • B_qxzb
  • B_qxzb
  • 2015-10-09 16:46:06
  • 876

JVM生命周期和类加载机制

一、java虚拟机的生命周期:   Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序...
  • rabbit_in_android
  • rabbit_in_android
  • 2015-12-22 22:27:50
  • 2309

【JVM系列】Java对象的生命周期与类型的卸载

一旦一个类被装载、连接和初始化,它就随时可以使用了。程序可以访问它的静态字段,调用它的静态方法,或者创建它的实例。类实例化类实例化有四种方式: 1、明确地使用new操作符 2、调用Class或者j...
  • hp910315
  • hp910315
  • 2015-12-15 21:58:34
  • 1041

Ti:关于类变量(静态成员变量)的作用域,以及生命周期

首先明确:类的生命周期 JVM几个重要的的内存区域分配: 1.code segment:存放代码; 2.data segment:存放静态变量/字符串常量; 3.s...
  • chuan1191330700
  • chuan1191330700
  • 2016-05-27 15:29:19
  • 755

java 静态变量生命周期(类生命周期)

Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存。类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享销毁:类被卸载时,静态变量被销毁,并释...
  • zhousenshan
  • zhousenshan
  • 2016-11-18 21:17:54
  • 3304
    个人资料
    等级:
    访问量: 3621
    积分: 172
    排名: 104万+
    文章分类