JVM基础(1)
1.Java的跨平台性
能跨平台的是Java程序,而不是JVM。
JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。
JVM(Java虚拟机)就是负责将字节码文件翻译成特定平台下的机器码,然后运行。
只要在不同平台上安装对应的JVM,就可以运行字节码文件,即运行Java程序。
我把它理解为,人类之间表达的语言可以当做JVM,而语言表达的含义当做程序员写的Java程序。世界上语言有很多,而我们所表达的含义不受语言类型的改变。
2.JVM
(1)JVM概念
JVM(Java虚拟机),是Java的核心和基础,是Java编译器和OS平台之间的虚拟处理器。
JVM有自己完善的硬件架构,如处理器,堆栈,寄存器等,还有相应的指令系统,但它只是一种用软件方法实现的抽象的计算机,且基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。
使用JVM,就不用担心你在什么平台上写的代码程序,至于JVM如何与底层平台沟通,是JVM自己的事情。
(2)JVM生命周期
- 1、启动和消亡:
JVM负责运行一个Java程序。当启动一个Java程序时,一个Java虚拟机实例也就诞生了。
JVM运行起点:Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。
当程序关闭退出时,这个虚拟机实例也就随之消亡。 - 2、JVM两种线程:
守护线程 and 非守护线程
(1)守护线程
通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。但Java程序也可以把创建的线程标记为守护线程。
(2)非守护线程
Java中的初始线程main()的线程就是非守护线程。
只要有任何非守护线程在运行,那么这个Java程序也在继续运行。当该程序中的所有的非守护的线程都终止时,虚拟机实例将会自动退出。 - 3、JVM退出的几种可能原因:
&1、自动退出:
程序正常运行结束。
程序运行过程中遇到异常或错误而异常退出。
操作系统的异常导致JVM进程终止。
&2、手动退出:
通过调用Runtime类或者System类的exit()方法来退出。
JVM的工作过程
- 类加载机制:
- Java类加载以下作为补充:
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 - 类加载的时机:
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载七个阶段。
其中验证、准备和解析三个部分统称为连接。
加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类的加载必须按照这种顺序开始。而解析阶段不一定:它在某些情况下可以在初始化之后再开始。 - 对于初始化阶段,虚拟机规范则是严格规定了有且只有的以下情况:
(1)遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果类没有进行初始化,则需要先触发其初始化。
生产这四条指令的常见场景:
使用new关键字实例化对象的时候;
读取或设置一个类的静态字段(被final修饰、已在编译期就把结果放在常量池的静态字段除外)的时候;
调用一个类的静态方法的时候。
(2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行初始化,则需要先触发其初始化。
(3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
(4)当虚拟机启动时,用户需要指定一个执行的主类(包含main()方法的类),虚拟机会先初始化这个类。