--java跨平台性
能跨平台的是java程序,而不是JVM。
其中JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。我们编写的java源码,编译后会生成一种 .class的字节码文件。java虚拟机就是负责将字节码文件翻译成特定的机器码然后运行,也就是说,只要在不同平台上安装对应的JVM,便可以运行字节码文件,在这个过程中,我们编写的Java程序没有做任何的改变,仅仅通过JVM,就能在不同平台上的运行,真正实现了“一次编译,到处运行”的目的。
-- JVM
JVM,即Java Virtual Machine,java虚拟机,是java的编译器和OS平台之间的虚拟处理器,它是利用软件的方式实现的抽象的计算机基于下层的操作系统和软件平台,可以在上面执行java的字节码程序。JVM有自己完善的软件架构,使用JVM就是为了支持与操作系统无关,实现跨平台。
-- JRE/JDK/JVM的关系
JRE(Java RuntimeEnvironment,java运行环境),也就是java平台。所有的java程序都需要在JRE下才能运行。普通用户需要运行已经开发好的java程序,只需要JRE就可以。
JDK(Java Development kit)是程序开发者用来编译,调试java程序的来发工具包,JDK的工具也是java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也要安装一部分。所以,在JDK的安装目录下有一个名为 jre 的目录,用来存放JRE文件。
JVM(JavaVirtualMachine, java虚拟机)是JRE的一部分。他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机来实现的。
-- JVM生命周期
启动和消亡:
JVM负责运行 一个Java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。
JVM运行起点:
Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。而这个main()方法必须是共有的(public)、静态的(static)、返回值为void,并且接受一个字符串数组作为参数。任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。
JVM两种线程:
守护线程和非守护线程。守护线程通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。但Java程序也可以把创建的线程标记为守护线程。而Java程序中的初始线程main()的线程是非守护线程。
只要还有任何非守护线程在运行,那么这个Java程序也在继续运行。当该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。假若安全管理器允许,程序本身也能够通过调用Runtime类或者System类的exit()方 法来退出。