Java虚拟机基础
1.Java虚拟机简介
Java虚拟机是一台虚拟的计算机,为了模拟Java程序运行环境,执行单个程序而设计。所以可以说Java的核心就是Java虚拟机,因为所有的Java程序都是运行在JVM虚拟机内。
Java虚拟机中执行的指令是Java字节码指令(二进制),Java字节码未必由Java语言编译而成。
Java指令是根据栈进行设计。栈:跨平台性、指令集小、指令多;执行器性能比寄存器查
Java虚拟机特点:一次编译,到处运行;自动内存管理;自动垃圾回收机制。
2.JVM的位置和整体结构,指令集架构
Java虚拟机运行在操作系统上(例Windows/Linux),不同操作系统JVM有一定区别,所以安装JDK时注意安装的系统环境。
类装载器子系统作用:把字节码文件加载至内存中,生成class对象
线程共享:方法区、堆
线程私有:虚拟机栈(Java栈),本地方法栈、程序计数器
执行引擎:高级语言翻译为机器指令,计算机只能识别机器指令,字节码文件不属于机器指令,所以需要编译。
3.Java代码的执行流程和生命周期
3.1.执行流程:
Java源码-->Java前端编译器-->字节码文件-->Java虚拟机(类加载器->字节码校验器->翻译字节码+JIT编译器)-->操作系统
第一次编译:把源文件编译成字节码文件
第二次编译:把字节码文件的字节码指令编译成机器指令
解释器:主要是为了保证响应时间,逐行对字节码文件解释执行
JIT编译器:可以把反复执行的代码(热点代码)编译成机器指令,同时把机器指令缓存到方法区中,主要是为了程序的执行性能。
解释器和JIT编译器一起使用效果最佳。如果只用解释器,因为解释器是逐行读取,效率低。只用JIT编译器,则可能会导致运行时间过长,因为JIT编译器是把热点代码编译为本地机器指令再缓存到方法区,而把代码编译为本地机器指令需要一定时间,所以不建议所有代码都进行JIT编译。
3.2.生命周期:
启动:引导类加载器(bootstrap class loader) 创建 初始类(具体虚拟机规定)进行启动的
执行:执行Java虚拟机进程
退出:正常技术/异常终止/系统错误/System.exit()等
反编译:javap -v 字节码文件.clss(全程),需要进入字节码文件目录执行
打印当前执行进程:jps