【Java 虚拟机系列知识:整理一】java虚拟机的生命周期
2009-06-26 14:26
363 查看
【Java 虚拟机系列知识:整理一】java虚拟机的生命周期
(内容整理自《深入Java虚拟机》,由于最近看,就把有用的东西整理一下)
要理解Java虚拟机,你首先必须意识到,当你说“Java虚拟机”,可能指的是如下3种不同的东西:
· 抽象规范。
.一个具体的实现。
.一个运行中的虚拟饥实例。
Java虚拟机抽象规范仅仅是个概念.在Tlm U Mdh01m和FrankYcmn编著的<Thc Javuviduaj
Mach;ne spec小caLion》一书中详细地描述述了它。而该规范的具体实现,可能来自多个提供商,
并存在于多个平台上。它或者完全用软件实现,或者以硬件和软件相结合的方式米实现。当运行一个Java程序的同时,也就在运行了—个Java虚拟机实例。
每个Java程序都运行于某个具体的Java虚拟机实现的实例上。在本文中.可能表示上述三种情形之一。
一个运行时的Java虚拟机实例的大职就是:负责运行一个Java程序。当启动一个Java程序时,
一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实促也就随之消失。如果公同一
台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己
的Java虚拟机实例中。
Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。而这个main()
方法必须是公有的(public)、静态的(static),返回值为void。并且接受一个字符串数组作为参
数。任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。
比如,考虑这样一个Java程序v它打印出传结它的命令行参数
必须(以某种与实现相关的方式)告诉Java虚拟机要运行的Java程序中初始类的名字,整个程序将从他的main()方法开始运行。
即要运行这个程序必须 :java Echo Greettings,Planet;
该命令中的 java就是告诉操作系统应该运行Sun java 2 SDK 的java虚拟机,"Echo”指出初始类的名字
Java程序初始化类中的main()方法,将作为该程序初始线程的起点,任何其他的线程都是由这个初始线程启动的。
在Java虚拟机内部有两种线程:守护线程与非守护线程。守护线程通常是出虚拟机自己使用的,比如执行垃圾收集任务的线程。但是,Java程序也可以把它创建的任何线程标记为守护线程。
而Java程序中的初始线程——就是开始于main()的那个,是非守护线程。
只要还有任何非守护线程在运行,那么这个Java程序也在继续运行(虚拟机仍然存活)。当该程序中所有的非守护线程部终止时,虚拟机实例将自动退出;假若安全管理器允许,程序本身也能够通过调用Runtime类或者system类的exit()方法来退出。
在前面的Echo程序中.它的maln()方法并未调用其他的线程。因此,当它打印完命令行参数后,main()方法返回。这就终止了该程序中惟一的非守护线程,最终导致虚拟机实例退出。
(内容整理自《深入Java虚拟机》,由于最近看,就把有用的东西整理一下)
要理解Java虚拟机,你首先必须意识到,当你说“Java虚拟机”,可能指的是如下3种不同的东西:
· 抽象规范。
.一个具体的实现。
.一个运行中的虚拟饥实例。
Java虚拟机抽象规范仅仅是个概念.在Tlm U Mdh01m和FrankYcmn编著的<Thc Javuviduaj
Mach;ne spec小caLion》一书中详细地描述述了它。而该规范的具体实现,可能来自多个提供商,
并存在于多个平台上。它或者完全用软件实现,或者以硬件和软件相结合的方式米实现。当运行一个Java程序的同时,也就在运行了—个Java虚拟机实例。
每个Java程序都运行于某个具体的Java虚拟机实现的实例上。在本文中.可能表示上述三种情形之一。
一个运行时的Java虚拟机实例的大职就是:负责运行一个Java程序。当启动一个Java程序时,
一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实促也就随之消失。如果公同一
台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己
的Java虚拟机实例中。
Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。而这个main()
方法必须是公有的(public)、静态的(static),返回值为void。并且接受一个字符串数组作为参
数。任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。
比如,考虑这样一个Java程序v它打印出传结它的命令行参数
Class Echo{ public static void main(String[] args){ int len = args.length; for( int i = 0;i < length; ++i){ System.out,print(args[i] +" "); } System.out.println(); } }
必须(以某种与实现相关的方式)告诉Java虚拟机要运行的Java程序中初始类的名字,整个程序将从他的main()方法开始运行。
即要运行这个程序必须 :java Echo Greettings,Planet;
该命令中的 java就是告诉操作系统应该运行Sun java 2 SDK 的java虚拟机,"Echo”指出初始类的名字
Java程序初始化类中的main()方法,将作为该程序初始线程的起点,任何其他的线程都是由这个初始线程启动的。
在Java虚拟机内部有两种线程:守护线程与非守护线程。守护线程通常是出虚拟机自己使用的,比如执行垃圾收集任务的线程。但是,Java程序也可以把它创建的任何线程标记为守护线程。
而Java程序中的初始线程——就是开始于main()的那个,是非守护线程。
只要还有任何非守护线程在运行,那么这个Java程序也在继续运行(虚拟机仍然存活)。当该程序中所有的非守护线程部终止时,虚拟机实例将自动退出;假若安全管理器允许,程序本身也能够通过调用Runtime类或者system类的exit()方法来退出。
在前面的Echo程序中.它的maln()方法并未调用其他的线程。因此,当它打印完命令行参数后,main()方法返回。这就终止了该程序中惟一的非守护线程,最终导致虚拟机实例退出。
相关文章推荐
- 【Java 虚拟机系列知识:整理二】java虚拟机查询class文件原理
- [计算机领域的思维导图系列整理][java] 虚拟机JVM
- java虚拟机知识整理——虚拟机的内存区域
- Java Web架构知识整理——记一次阿里面试经历
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
- Java多线程整理(一)-基本知识
- java基础知识整理 一些问题的解答(面试)
- Java基础知识整理总结帖(更新中)
- Java知识图谱收集整理
- java知识整理
- 黑马程序员_java学习日记_Java基础小知识学习整理
- Java基础知识系列之注解基本概念
- Java基础知识资料整理
- Spring知识整理(三)Spring之Bean之间的关系,Bean的作用域,Bean的生命周期
- Java基础知识整理之异常篇
- java 字符深入知识,待整理
- 《PHP高级知识进阶》系列技术文章整理收藏
- Java基础系列教程(一):Java介绍、前置知识及环境搭建
- Java Web 架构系列 知识(二) 学习高可用
- Java虚拟机知识整理——类加载的过程