Java虚拟机基础教程-概论
Java虚拟机的原理与实现

Java虚拟机的原理与实现Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心,也是Java语言的重要特性之一。
不同于其他编程语言的Interpreter或编译器,Java语言的运行环境是基于虚拟机的。
它可以将Java代码编译成字节码文件,并在JVM上运行,从而实现了Java语言的跨平台特性。
Java虚拟机是Java技术的基石,它的设计和实现影响了适用于Java语言的各种应用程序的性能、可靠性和可移植性。
本文将剖析Java虚拟机的原理和实现,以帮助开发人员深入了解Java语言的核心设计。
一、Java虚拟机的组成部分Java虚拟机是由不同的组件组成的,这些组件负责不同的功能。
下面是Java虚拟机的几个组件:1. Class Loader(类加载器)类加载器是Java虚拟机的核心组件之一。
它的主要任务是将类的字节码加载到JVM中。
类的字节码可以存放在本地文件系统、网络等位置。
在加载过程中,类加载器将类的字节码转化为JVM可识别的格式,并将其放置在Java堆中。
Java虚拟机中的类加载的过程遵循了父子代的模型,即一个类加载器可以有一个或多个父加载器和一个或多个子加载器。
2. Java堆Java堆是Java虚拟机管理的内存区域的重要部分,其中主要存储对象实例。
在类加载器将类的字节码加载到Java虚拟机中之后,运行时数据区域中会为每一个对象分配一定的内存空间。
此时,Java堆中的对象就产生了。
3. Java栈Java栈是Java虚拟机运行时数据区域中的另一个组件。
它主要用来存放方法执行时的局部变量、操作数栈和方法的执行过程。
每个线程都拥有一个独立的Java 栈。
当线程调用一个方法时,Java虚拟机创建一个新的栈帧并将其插入到Java栈的顶部。
当方法执行结束时,该栈帧被弹出,并释放相应的内存空间。
4. Native方法栈Native方法栈和Java栈类似,但用于执行本地方法。
JAVA虚拟机基础教程

11年11月11日星期五
第三方私有组件 rendering color managment sound support
11年11月11日星期五
IcedTea
Java名人
Jame Gosling
Java语言发明者
11年11月11日星期五
Josh Bloch
2011-‐7-‐28 NIO 2.0 Invoke Dynmaic String-‐Switch Try-‐With-‐ Resource
Java SE 7
1995
2000
2005
2010
1995年,Sun发布Java 1.0,承诺:Write Once,Run Anywhere Java语言发展很慢,但是Java虚拟机发展很快!
阿里巴巴B2B主流版本
2004-‐10-‐30 泛型
For-‐Each Autoboxing 变长参数
u6l.concurrent JMX
2006-‐10-‐11
Annota6on Swing增强 JPDA增强
JM Tool Interface
J2SE 5.0
Java SE 6
Java Collection Framework java.math
assert mechanism 《Effective Java》 《Java Puzzlers》 《Java Concurent In Practice》
Doug Lea
JSR 166: Concurrency Utilities 《Concurrent Programming in Java》
合并到OpenJDK
java虚拟机运行原理

java虚拟机运行原理Java虚拟机(Java Virtual Machine,JVM)是Java程序运行的基础,它是Java语言的核心部分。
本文将深入探讨Java虚拟机的运行原理,包括JVM的体系结构、类加载过程、内存管理、垃圾回收和即时编译等关键内容。
一、JVM的体系结构Java虚拟机的体系结构包括类加载器(ClassLoader)、运行时数据区(Runtime Data Area)和执行引擎(Execution Engine)。
类加载器负责将Java源文件编译后的字节码文件加载到JVM中,运行时数据区包括方法区、堆、虚拟机栈、本地方法栈和程序计数器,而执行引擎则负责解释和执行字节码。
二、类加载过程类加载是Java虚拟机的核心功能之一,它将类的二进制数据加载到内存中,并对数据进行校验、准备和解析。
类加载过程包括加载、验证、准备、解析和初始化五个阶段,其中验证阶段对字节码进行验证,确保它符合Java虚拟机规范;准备阶段负责为类变量分配内存,并设置初始值;解析阶段将符号引用转化为直接引用;初始化阶段是类加载过程的最后一步,它负责执行类的初始化方法。
三、内存管理Java虚拟机的内存管理主要包括堆、栈和方法区。
堆是Java虚拟机中最大的一块内存区域,用于存储对象实例和数组。
栈则用于存储局部变量、方法参数和返回值等信息,它以栈帧的形式存在,每个方法调用都会创建一个栈帧。
方法区用于存储类的结构信息、常量池和静态变量等数据。
四、垃圾回收Java虚拟机通过垃圾回收机制来自动释放不再使用的内存。
垃圾回收的核心算法包括标记-清除、复制、标记-整理和分代收集等。
标记-清除算法先标记出所有活动对象,然后清除未标记的对象;复制算法将内存分为两块,一块用于存储存活对象,另一块用于存储新创建的对象,当一块内存用完后,将活动对象复制到另一块内存中;标记-整理算法将存活对象向一端移动,然后清理掉端部空间;分代收集算法将内存划分为不同的代,根据对象的存活周期采用不同的垃圾回收算法。
java虚拟机讲解PPT课件

public static void main(ng.String[]);
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic 3: ldc
#2; Field java/lang/System.err #3; String “Hello world!\n”
• 基于模板的解释执行
– 高级语言 + 汇编语言 – 一个字节码被解释成固定的若干条指令序列,这样的一个序列
片段称为一个“模板” – 字节码解析:通过检索模板表实现 – 优点:性能高(通常达到前者的2~3倍) – 缺点:引入平台相关性,加大了移植难度
2021
36
即时编译
• 综合解释器、翻译器的优点 • 以方法的运行频度区分两种执行方式
2021
7
本书要介绍什么内容?
(一)Java虚拟机的基本原理 (二)解释器
- 纯平台无关的解释器 - 基于模板的解释器
(三)即时编译器
- C1 和 C2 - 寄存器分配 - 翻译规则 - 重定位 - 翻译后代码管理 - 运行时环境的切换
(四)垃圾回收
(五)异常处理
(六)JNI
(七)重要数据结构
- 栈帧 - 常量池
• 优点
– 规格紧凑,体积精简
2021
21
《Java虚拟机规范》
• 规定所有字节码的规格
– 参数 – 运算语义 – 返回值 – 异常处理方式
2021
22
字节码实例
aload_0
[简述] 从局部变量表装载对象指针 [格式] aload_0 = 42 [栈] ... => ..., value [详述] 将当前Java栈中局部变量表的第一个 元素压入栈顶
JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)

JVM,Java虚拟机基础知识新⼿⼊门教程(超级通熟易懂)⼀.写在前⾯ ⾸先,本篇⽂章并没有涉及原理,⽽是在笔者撸了《深⼊理解Java虚拟机》好⼏遍的基础上讲解⾃⼰的经验,从⼀个新⼿到现在明⽩JVM是个什么玩意,怎么去理解和明⽩,讲解这样⼀个经验⽽已。
这篇⽂章并对JVM并没有挖掘得很深,在下⽬前暂时也没有这个能⼒,只是以通熟易懂的⽅式,让读者理解JVM是个什么玩意。
下⾯开始我的讲解。
⼆.谁说⼈神不得相爱——Java的跨平台 理解Java的跨平台特性,是对JVM最直观的认识。
所谓的“⼀次编译,到处运⾏”,为什么C/C++ 却不能实现呢?这⼀类语⾔直接使⽤物理硬件(或者说操作系统的内存模型),那么不同系统之间的内存模型是不同的,⽐如说Linux和Window,这就意味,在Window编译好的代码,却不能在Linux上运⾏。
《深⼊理解Java虚拟机》记录说,Java虚拟机规范中试图定义⼀种Java内存模型(JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台上都能达到⼀致性的并发效果。
举个现实的例⼦,⼀个只会听说中⽂的⼈,要如何和⼀个只会听说英⽂的⼈交流,在Java的世界⾥,采⽤的⽅式即是给两边的⼈各配⼀名翻译官(JVM),所以,这就是为什么JVM要有window版本,也要有Linux版本。
众所周知,Java的程序编译的最终样⼦是.class⽂件,不同虚拟机的对每⼀个.class⽂件的翻译结果都是⼀致的。
⽽对于C/C++⽽⾔,编译⽣成的是纯⼆进制的机器指令,是直接⾯对计算机系统的内存,但是,java程序的编译结果是⾯向JVM,是要交付给JVM,让他再做进⼀步处理从⽽让计算机识别运⾏,这就是所谓的“屏蔽掉各种硬件和操作系统的内存访问差异”。
这⾥的特点⼜和⾯向对象推崇的⾯向接⼝有着不可描述的关系,我只需要有这么个规范,不需要去知道接触你的底层原理实现。
三.活在梦⾥的真实——虚拟机 JVM,全称Java Virtual Machine,英⽂为Java虚拟机,简单的探讨⼀下虚拟机这三个字,对后⾯的学习也是挺舒服的。
Java虚拟机原理及优化技巧

Java虚拟机原理及优化技巧Java虚拟机(JVM)是Java程序的核心执行环境。
它是一种基于栈的解释执行方式,可以在各种操作系统上运行Java程序。
Java是一种编译型语言,编译器将Java源代码编译成Java字节码,而JVM则将Java字节码解释成计算机可执行代码。
Java虚拟机的架构JVM是一个用于执行Java字节码的虚拟机,是Java技术的核心所在。
JVM的架构主要由三部分组成:类加载器、执行引擎和运行时数据区域。
1. 类加载器类加载器负责将Java字节码加载到JVM中,并转换成JVM内部表示的类结构。
JVM中有三种类加载器:启动类加载器、扩展类加载器和应用程序类加载器。
其中,启动类加载器负责加载JVM自身的类库,扩展类加载器负责加载Java扩展类库,应用程序类加载器负责加载应用程序的第三方类库和应用程序自身的类。
2. 执行引擎执行引擎是JVM的核心,负责执行Java字节码。
执行引擎有两种实现方式:解释器和即时编译器(JIT)。
解释器将Java字节码解释成计算机可执行代码,执行效率较低;JIT则将Java字节码编译成本地机器码,执行效率更高。
JIT是JVM的性能优化的重要手段之一。
3. 运行时数据区域运行时数据区域是JVM用于存储数据的区域。
包括:方法区、堆、栈、程序计数器和本地方法栈。
其中,方法区存储类信息、常量池、静态变量等数据;堆存储对象实例;栈存储基本类型、对象引用、方法返回值等数据;程序计数器记录当前线程的执行位置;本地方法栈存储Java调用本地方法时的参数和返回值。
JVM的优化技巧JVM的性能优化是Java应用程序优化的重要手段之一。
以下是几种JVM的优化技巧:1. 垃圾回收优化Java程序中的垃圾回收是JVM自动进行的,但垃圾回收所花费的时间对程序的性能有着直接的影响。
通过调整JVM的垃圾回收策略和垃圾回收器的参数,可以降低垃圾回收的开销,提高程序的执行效率。
2. 即时编译器(JIT)JIT是JVM的一个重要组成部分,通过将Java字节码编译成本地机器码,可以大大提高程序的执行效率。
Java虚拟机原理,理解Java程序底层运行机制

Java虚拟机原理,理解Java程序底层运行机制Java作为一门跨平台的高级编程语言,可以在不同的操作系统和硬件平台上运行,这主要得益于Java虚拟机。
Java虚拟机是一种基于栈式结构的计算机,负责执行Java程序,并提供跨平台的支持。
本文将从Java虚拟机的基本原理、Java程序的执行过程、Java内存模型和垃圾收集等方面,深入分析Java程序的底层运行机制。
一、Java虚拟机的基本原理Java虚拟机是由Java编译器将Java源代码编译成Java字节码文件,然后由Java虚拟机负责解释和执行字节码文件。
Java虚拟机采用栈式结构,它的基本运行单元是栈帧。
每个方法在被执行时,都会创建一个栈帧,在栈帧中保存着该方法的局部变量表、操作数栈、返回地址等信息。
每条指令在执行时,都会从操作数栈中取出相应的数据,进行计算,并把计算结果重新压回操作数栈中。
当一个方法被调用时,Java虚拟机会创建一个新的栈帧,将该方法的参数和返回值压入操作数栈中,并跳转到该方法的第一条指令开始执行。
当该方法执行完成后,Java虚拟机会弹出该方法的栈帧,并将执行结果返回给调用该方法的方法。
Java虚拟机的主要优点是跨平台性,但它也存在一些缺点。
由于需要解释执行字节码文件,Java程序的执行速度相对较慢。
为了提高Java程序的执行效率,Java虚拟机可以采用即时编译技术,将字节码文件直接编译成机器语言,再直接执行。
二、Java程序的执行过程Java程序的执行过程可以分为编译和执行两个阶段。
编译阶段通过Java 编译器将Java源代码编译成Java字节码文件,包括编译、优化、生成字节码等过程,其中编译器会进行静态检查,以确保程序的正确性。
执行阶段则是Java虚拟机将字节码文件解释或编译成机器语言,执行其中的指令。
Java程序在运行时,会调用Java虚拟机的类加载器,将需要运行的类装载到Java虚拟机中,并进行链接和初始化。
链接过程包括验证、准备和解析三个步骤,其中验证是确保该类的正确性,准备是为类的静态变量分配内存并设定初始值,解析是将符号引用转换为直接引用。
java虚拟机学习

Java虚拟机学习(1):体系结构内存模型2016/11/02 | 分类:技术架构 | 0 条评论 | 标签: JVM分享到:8原文出处:java2000_wl一:Java技术体系模块图二:JVM内存区域模型1.方法区也称”永久代”、“非堆”,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。
默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和-XX:MaxPermSize 参数限制方法区的大小。
运行时常量池:是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。
2.虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息。
每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
声明周期与线程相同,是线程私有的。
局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(引用指针,并非对象本身),其中64位长度的long和double 类型的数据会占用2个局部变量的空间,其余数据类型只占1个。
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量是完全确定的,在运行期间栈帧不会改变局部变量表的大小空间。
3.本地方法栈与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。
4.堆也叫做java 堆、GC堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。
该内存区域存放了对象实例及数组(所有new的对象)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
Agenda
JAVA技术体系
JAVA发展史
JAVA虚拟机的介绍及发展史
ห้องสมุดไป่ตู้
JAVA技术未来的发展趋势
2
JAVA技术体系
JAVA不仅仅是一门编程语言,它还是 一个由众多软件与规范组成的技术体 系。 该体系提供了使用JAVA语言进行软件 开发的标准与规范,并且为跨平台应 用的部署提供相应的支持环境。
13
JAVA虚拟机的介绍及发展史-JVM的体系结构
一、JVM在运行时将数据划分为了6个区域来存储,而不仅仅是大家熟知的Heap区 域,这6个区域图示如下:
14
JAVA虚拟机的介绍及发展史-JVM的体系结构
第一块: PC寄存器 PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储 任何信息。 第二块:JVM栈
16
JAVA虚拟机的介绍及发展史
•Sun Classic/Exact VM
KVM CDC/CLDC Hotspot Implementation Squawk VM JavaInJava Maxine VM
•Sun HotSpotVM
•Sun Mobile-Embedded VM/Meta-Circular VM •BEA Jrockit/IBM J9 VM •AzulVM/BEA Liquid VM •Apache Harmony/Google Android DalvikVM •Microsoft JVM及其他
12
JAVA虚拟机的介绍及发展史-JVM的体系结构
二、执行技术 主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行 (1)解释属于第一代JVM, (2)即时编译JIT属于第二代JVM, (3)自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第 二代JVM的经验,采用两者结合的方式 (4)自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执 行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代 码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其 进行解释执行。
4
JAVA技术体系
5
JAVA技术体系
以上是根据各个组成部分的功能来进行划分的,如果按照技术所服务 的领域来划分,或者说按照Java技术关注的重点业务领域来划分, Java技术体系可以分为四个平台,分别为:
Java Card Java ME(Micro Edition):以前称为J2ME。 Java SE(Standard Edition):以前称为J2SE。 Java EE(Enterprise Edition):以前称为J2EE。
第五块:运行时常量池(Runtime Constant Pool) 类似C中的符号表,存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。 第六块:本地方法堆栈(Native Method Stacks) JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
9
JAVA虚拟机的介绍及发展史-JVM的体系结构
JVM的内部体系结构分为三部分: (1)类装载器(ClassLoader)子系统 作用: 用来装载.class文件 (2)执行引擎 作用:执行字节码,或者执行本地方法 (3)运行时数据区 方法区,堆,java栈,PC寄存器,本地方法栈
10
JAVA虚拟机的介绍及发展史-JVM的体系结构
17
JAVA技术未来的发展趋势
模块化
64位虚拟
机
混合语言
进一步丰 富语法
多核并行
18
JAVA技术未来的发展趋势-64位虚拟机
JVM 32bit 和JVM 64bit的区别: 1目前只有server VM支持64bit JVM,client不支持32bit JVM。 2 .The Java Plug-in, AWT Robot and Java Web Start这些组件目前不支持64bit JVM 3.本地代码的影响:对JNI的编程接口没有影响,但是针对32-bit VM写的代码必须重新 编译才能在64-bit VM工作。 4.32-bit JVM堆大小最大是4G, 64-bit VMs 上, Java堆的大小受限于物理内存和操作系统提 供的虚拟内存 5.线程的默认堆栈大小:在windows上32位JVM,默认堆栈最大是320k,64-bit JVM是1024K。 6.性能影响: (1)64bit JVM相比32bit JVM,在大量的内存访问的情况下,其性能损失更少,AMD64和 EM64T平台在64位模式下运行时,Java虚拟机得到了一些额外的寄存器,它可以用来生 成更有效的原生指令序列。 (2)性能上,在SPARC 处理器上,当一个java应用程序从32bit 平台移植到64bit平台的64bit JVM会用大约 10-20%的性能损失,而在AMD64和 EM64T平台上,其性能损失的范围在 0-15%. (/docs/hotspot/HotSpotFAQ.html#64bit_description)
6
JAVA发展史
7
JAVA虚拟机的介绍及发展史
Java语言的一个非常重要的特点就是与平台的无关性。而 使用Java虚拟机是实现这一特点的关键。一般的高级语言 如果要在不同的平台上运行,至少需要编译成不同的目 标代码。而引入Java语言虚拟机后,Java语言在不同平台上 运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与 具体平台相关的信息,使得Java语言编译程序只需生成在 Java虚拟机上运行的目标代码(字节码),就可以在多种 平台上不加修改地运行。Java虚拟机在执行字节码时,把 字节码解释成具体平台上的机器指令执行。这就是Java的 能够“一次编译,到处运行”的原因。
第三块:堆(Heap) Heap是大家最为熟悉的区域,它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通 过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
15
JAVA虚拟机的介绍及发展史-JVM的体系结构
第四块:方法区域(Method Area) (1)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、 类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取 信息时,这些数据都来源于方法区域,可见方法区域的重要性,同样,方法区域也是全局共享的,在一定的 条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。 (2)在Sun JDK中这块区域对应的为Permanet Generation,又称为持久代,默认为64M,可通过-XX:PermSize以 及-XX:MaxPermSize来指定其大小。
一、 JVM将整个类加载过程划分为了三个步骤: (1)装载
装载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通过ClassLoader来完 成类的加载,同样,也采用以上三个元素来标识一个被加载了的类:类名+包名+ClassLoader实例ID。
(2)链接
链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接 口、类。 在完成了校验后,JVM初始化类中的静态变量,并将其值赋为默认值。 最后一步为对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应 的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误信息。
(3)初始化
初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初 始化过程会被触发执行:
调用了new;反射调用了类中的方法;子类调用了初始化;JVM启动过程中指定的初始化类。
11
JAVA虚拟机的介绍及发展史-JVM的体系结构
一、JVM通过执行引擎来完成字节码的执行,在执行过程中JVM采用的是自己的一套指 令系统,每个线程在创建后,都会产生一个程序计数器(pc)和栈(Stack),其中 程序计数器中存放了下一条将要执行的指令,Stack中存放Stack Frame,表示的为当前 正在执行的方法,每个方法的执行都会产生Stack Frame,Stack Frame中存放了传递给 方法的参数、方法内的局部变量以及操作数栈,操作数栈用于存放指令运算的中间 结果,指令负责从操作数栈中弹出参与运算的操作数,指令执行完毕后再将计算结 果压回到操作数栈,当方法执行完毕后则从Stack中弹出,继续其他方法的执行。 在执行方法时JVM提供了invokestatic、invokevirtual、invokeinterface和invokespecial四种指 令来执行 (1)invokestatic:调用类的static方法 (2) invokevirtual: 调用对象实例的方法 (3) invokeinterface:将属性定义为接口来进行调用 (4) invokespecial: JVM对于初始化对象(Java构造器的方法为:<init>)以及调用对 象实例中的私有方法时。
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本 类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部 分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址
19
20
8
JAVA虚拟机的介绍及发展史-JVM的生命周期
(1)JVM实例的诞生 当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点 (2)JVM实例的运行 main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内 部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通 常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。 (3)JVM实例的消亡 当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程 序也可以使用Runtime类或者System.exit()来退出。