Java对象的生命周期

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java对象的生命周期

1.前言

讲座内容:从JVM的角度讨论Java对象的创建至销毁的整个过程,以及一些相关的问题:包括垃圾回收、内存泄漏和缓存。最后将介绍Spring如何管理Java 对象。

适合对象:有一定基础的Java程序员

J AVA体系结构

Java的体系结构分为四部分:Java编程语言、API、Class文件、JVM

JVM与JRE、JDK的关系

JVM:Java Virtual Machine 负责执行符合规范的class文件

JRE:Java Runtime Environment 包含JVM和类库

JDK:Java Development Kit 包含JRE与一些工具,比如javac

不同的JVM

Sun Hotspot

Oracle Jrocket

IBM J9

2.编译

Java的解析过程:

2.1.词法分析

2.2.语法分析

2.3.生成CLASS文件

package training.javaobject;

public class Asm {

public static void doit() {

int x = 0;

int y = x + 5;

}

}

public class training.javaobject.Asm {

public Asm();

0 aload_0 [this]

1 invokespecial ng.Object() [8]

4 return

Line numbers://定义行号

[pc: 0, line: 3]

Local variable table://局部变量表

[pc: 0, pc: 5] local: this index: 0 type: training.javaobject.Asm

public static void doit();

0 iconst_3 //定义变量3

1 istore_0 [x] //存储x = 0

2 iload_0 [x] //读取变量x

3 iconst_5//常量5

4 iadd//相加

5 istore_1 [y]//存储为y

6 return//返回

Line numbers://定义行号

[pc: 0, line: 5]

[pc: 2, line: 6]

[pc: 6, line: 7]

Local variable table://定义变量表

[pc: 2, pc: 7] local: x index: 0 type: int

[pc: 6, pc: 7] local: y index: 1 type: int

}

问题:可以动态修改class文件吗?

3.装载

●Bootstrap ClassLoader/启动类加载器

主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作。

●Extension ClassLoader/扩展类加载器

主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。

●System ClassLoader/系统类加载器

主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。

User Custom ClassLoader/用户自定义类加载器(ng.ClassLoader 的子类)

在程序运行期间, 通过ng.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。

问题:ejb如何加载类?

习题:如果一个独立的Java程序(如通讯机)需要引用大量的.jar文件,那必须把这些文件写在classpath中,很繁琐且容易出错。如何利用classloader实现只需要指定一个目录,就能自动装入目录内需要的.jar文件中的class?

4.JVM

4.1.JVM的启动和终止

启动JVM:public static void main(String[] args)

终止JVM:System.exit();

问题:在大型应用程序中(比如weblogic),不使用kill或者ctrl+break终止程序。而是有专门的命令。使用命令的好处是:weblogic将尽量处理完正执行到一半的线程。这是如何实现的呢?

4.2.JVM的体系结构

●方法区和堆:程序运行时,会把class解析出的一些类型信息等放入方法区;

创建的对象放入堆

●本地方法栈:JVM访问本地方法所用到的栈

●Java栈:记录每个方法的调用状态,包括局部变量、参数、返回值等

Java栈是基于线程的,如图:

问题:java类变量和局部变量有什么不同?

问题:以下代码有什么不同

4.3.初始化类

只有以下六种情况下,类会被初始化:

●new

●执行静态方法

●使用静态字段(final除外,编译器会解析成本低常量拷贝) ●反射

●初始化某个类的子类

●启动类(执行main方法的那个类)

问题:以下写法是不好的

4.4.类实例化:

通常以下情况会创建类的实例

●new

●newInstance

●clone

●ObjectInputStream.getObject()

4.5.垃圾回收

垃圾回收是指释放不用的对象

4.5.1.垃圾回收算法:

●引用计数:会出现循环引用的问题●拷贝收集器:

●按代收集的收集器

●自适应收集器

一个Weblogic gc 图

相关文档
最新文档