Java对象的生命周期
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 图