`
JackyCheng2007
  • 浏览: 253788 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 执行过程详解 - JVM 生命周期

    博客分类:
  • Java
阅读更多
Java的执行过程也就是JVM从启动到退出的过程。JVM的运行是一个进程单元,可以用jps工具列举出正在运行的JVM 进程。在一个JVM进程中可以运行多个线程。
1. JVM 启动
当用java工具运行一个编译好的class文件的时候,比如下面的命令,我们就通过调用Test的main函数启动了一个JVM进程。并且传给main函数一个字符串数组{"reboot", "Bob", "Dot", "Enzo"}
java Test reboot Bob Dot Enzo

2. 加载类Test
如果JVM发现Test类还没有被加载,就会调用class loader去加载这个类的class 文件。
加载类,就是说ClassLoader 利用它的defineClass 方法来从class文件构建Class对象。
ClassLoader 应该有如下的特征:
1. 对于同一个类名,ClassLoader 多次load得到的类对象应该是一样的。
2. 如果ClassLoader  L1 委托ClassLoader L2去load类C,对于任意类型T,如果T是C的直接父类或接口,或者是C的属性的类型,或者是C的方法的参数的类型或者返回值的类型,那么L1和L2 load出来的T的类的对象应该是一样的。

load完成之后,就可以连接这些类型,让他们进入可执行状态。
3. 连接 Test: 验证 Verify, 准备 Prepare, 解析 (Optionally) Resolve
在执行main之前要先初始化这个类,在初始化之前还要先连接,连接就是要验证,准备和解析。
验证就是检查语法和符号表,如果失败会报错。
准备就是要准备内存,主要为静态属性以及jvm内部需要的数据结构。这时只会将静态属性设置为默认值,但是静态代码块的执行不在这里,而是在初始化阶段。

解析就是检查这个Test对其他的对象或接口的引用,看看是不是那些引用的类和接口也被load进来了。没有的话就要load。解析过程是可选的,是因为你可以选择在load Test的时候load所有Test应用的类和接口,也可以在运行时真正用到的时候再load,也就是lazy load。


4.初始化 initialization
在main执行之前,必须先对类进行初始化。初始化类的变量,还有静态代码块。初始化的时候还要先初始化它的父类。每个类都有一个隐含的父类Object。
初始化过程发生在:
1. T是一个类,当T的一个实例创建的时候,也就是T t = new T();
2. T的一个静态方法被调用的时候,也就是 T.staticField();
3. T的静态属性被赋值的时候,T.staticField = o;
4. T的一个静态属性被使用的时候,也就是 Object o = T.staticField; 但是它不是常量。
5. T is a top level class , and an assert statement  lexically nested
within T  is executed. (不懂,求解)
class Super {
static { System.out.print("Super "); }
}
class One {
static { System.out.print("One "); }
}
class Two extends Super {
static { System.out.print("Two "); }
}
class Test {
public static void main(String[] args) {
One o = null;
Two t = new Two();
System.out.println((Object)o == (Object)t);
}
}


输出:
Super Two false

One没有被初始化,因为没有被调用过,Super在Two之前初始化。

class Super {
static int taxi = 1729;
}
class Sub extends Super {
static { System.out.print("Sub "); }
}
class Test {
public static void main(String[] args) {
System.out.println(Sub.taxi);
}
}

输出: 1729
Sub没有被初始化,因为taxi实际上上Super的属性。Sub没有静态属性被使用,所以不被初始化。所以不要在子类里面初始化父类的静态变量。

因为Java程序是多线程的,所以初始化过程需要同步synchronize,这是由jvm负责的。
Class对象有可能处在下面的状态之下:
1. 验证和准备好了,但还没有初始化
2. 正在被某个线程初始化中
3. 初始化好了,可以运行了
4. 错误状态,初始化失败


5. 调用 Test.main
初始化好之后,就开始调用Test.main。这个main方法必须得是public, static, and void.
public static void main(String[] args)
public static void main(String... args)


6. 卸载类对象
这是一个优化过程,是为了释放内存的,但是JVM说明书并不严格定义这一行为,这取决于具体实现的优化策略。
7. 程序退出
当下面的条件之一发生的时候:
1. 所有的非daemon线程都终止了
2. 某个线程调用了类Runtime或者System的exit方法
分享到:
评论
1 楼 探索者_技术 2016-06-06  
不错 讲解的比较详细

相关推荐

    2015-09-12-Java虚拟机详解----JVM常见问题总结【面试必问】

    现代JVM多采用分代收集策略,针对不同生命周期的对象进行不同的垃圾收集。 2. **垃圾收集器**:如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)等,每种收集器各有优缺点,适用于不同场景...

    java-JVM-面试题从基础到高级详解-HM

    Java虚拟机(JVM)是Java程序运行的核心,它提供了执行Java字节码的环境,是Java平台的重要组成部分。在面试中,对于Java开发者来说,深入理解JVM的工作原理、内存管理和性能调优等知识是必不可少的。"java-JVM-面试...

    最新java面试专题01-JVM

    JVM生命周期概述 JVM的生命周期从启动一个Java程序开始,具体步骤如下: 1. **启动**:通过`java`命令启动JVM实例,指定main-class参数来指定应用程序的入口。 2. **运行**:执行`public static void main(String...

    java内存模型详解--非常经典

    这些区域各自有不同的功能和生命周期。 1. 堆:这是Java对象的主要存储区域,所有实例对象和数组都在堆中分配内存。堆是线程共享的,因此在多线程环境下需要特别关注内存的同步和可见性问题。 2. 栈:每个线程都有...

    JVM详解-淘宝内部资料

    "JVM详解-淘宝内部资料"提供了一套深入理解JVM的资源,涵盖了从基础到高级的各种主题,包括Java虚拟机的生命周期、JVM的体系结构、各个组件的详细解析以及垃圾收集(Garbage Collection, GC)机制等内容。...

    Java对象在JVM中的生命周期详解

    "Java对象在JVM中的生命周期详解" Java对象在JVM中的生命周期是Java编程语言中一个非常重要的概念,它涉及到Java对象的创建、使用、释放和销毁整个过程。在JVM中,Java对象的生命周期可以分为七个阶段:创建阶段、...

    2024年java面试题-jvm性能调优面试题第一部分

    - **Java虚拟机栈**:用于存储每个线程的方法执行过程中所需的局部变量表、操作数栈、动态链接、方法出口等信息。 - **本地方法栈**:与Java虚拟机栈类似,但服务于本地方法的调用。 - **Java堆**:所有线程共享的...

    2020-review-7-jvm.pptx

    - **选择合适的 GC 算法**:根据对象的生命周期和内存区域的特点选择最适合的回收策略。 - **性能优化**:通过调整 GC 参数、改进算法等方式减少 GC 对应用程序性能的影响。 综上所述,JVM 的内部原理涉及多个层面...

    详解java类的生命周期.doc

    ### 详解Java类的生命周期 #### 引言 在探讨Java类的生命周期之前,我们先简单回顾一下Java类从创建到销毁的过程。Java作为一种广泛使用的编程语言,其强大的功能背后离不开Java虚拟机(JVM)的支持。对于Java...

    细述 Java垃圾回收机制→How Java Garbage Collection Works- - Android 1

    4. Major GC:在Java垃圾回收过程中实例生命周期的最后一个阶段。Major GC在垃圾回收过程中扫描属于Old Generation部分的堆内存。 垃圾回收器类型 ------------- Java提供了四种可用的垃圾回收器类型: 1. Serial...

    java基础核心学习笔记

    - 对象生命周期:创建、使用、垃圾收集。Java自动管理内存,程序员无需手动释放内存。 - 垃圾收集器:当一个对象不再被引用时,垃圾收集器会回收其占用的内存。 6. **集合框架** - List、Set、Map接口:分别代表...

    JVM性能调优-JVM内存整理及GC回收.pdf

    老年代的对象生命周期更长,回收频率较低。 3. **永久代**:用于存储类元数据、静态变量等信息。从Java 8开始,永久代被元空间(Metaspace)取代。 #### 总结 综上所述,JVM性能调优涉及多个方面,包括理解参数传递...

    深入JVM概要 JVM详解

    本文将详细介绍Java虚拟机(JVM)的内部机理和实现原理,从类型的生命周期、方法区、常量池、类加载器、垃圾收集器、栈和局部变量等方面对JVM进行深入解析。 类型的生命周期 类型的生命周期是JVM中最重要的部分,...

    Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

    首先,我们来了解Java类在JVM(Java虚拟机)中的生命周期。一个Java类的生命周期包括加载、验证、准备、初始化和卸载五个阶段,但通常在实际应用中,卸载阶段很少发生,因此我们将主要关注前四个阶段。 1. **加载**...

    jvm和gc详解及调优

    3. **对象生命周期**:从对象的创建、使用到回收的整个过程,包括内存分配、初始化、使用和垃圾收集。 4. **垃圾收集机制**:GC是JVM自动管理内存的主要手段,涉及分代收集、标记-清除、复制、标记-整理等多种算法...

    详解java类的生命周期

    本文详细讲述了一个java类自调入内存至被卸载的整个声明周期,对理解对象的生命周期,jvm中的类加载等内容有所帮助。

    Java JVM详解

    - 堆栈分离:堆和栈的分离有利于并发执行和垃圾回收,因为栈内存的生命周期明确,而堆内存的生命周期则相对复杂。 了解和掌握JVM的工作原理、内存管理和调优技巧,对于提升Java程序的性能和稳定性至关重要,尤其在...

Global site tag (gtag.js) - Google Analytics