浅谈Java虚拟机结构

Java虚拟机:用于运行class字节码的虚拟机器,是class字节码与实际硬件与操作系统的缓冲角色,使Java能够“一次编写,到处运行”。虽然Java语言没有与特定硬件机器和操作系统无关,但虚拟机却与硬件和操作系统相关,具有特异性。原理是不管在什么平台上编写的Java程序,经编译后都生成统一规范的calss文件。当class文件在不同硬件与操作系统上运行时,对虚拟机来说,都是统一字节码指令。而虚拟机根据不同环境,将相同的字节码指令翻译成当前机器和操作系统的特殊指令。所以,Java语言没有平台相关性,但是Java虚拟机具有相关性。既然只要是按照Java规范编译成的class文件,就可以在不同环境运行,所以,其它语言,比如ruby,只要是按照规范编译成class文件,也可以在Java虚拟机上运行。未来Java虚拟机中运行的一个系统,可能是多中语言编译成的class文件,以便不同综合用不同语言的优点。
虚拟机生命周期:当运行某个程序中的main方法时,就会产生一个虚拟机实例,即一个虚拟机诞生了,运行三个main方法,就诞生三个。虚拟机内部有两种线程--守护线程和非守护线程。守护线程通常由虚拟机自己使用,比如垃圾收集线程。Java程序中创建的线程,默认为非守护线程,比如main函数,程序可以手动将创建的线程标记为守护线程(修改线程daemon属性)。只要程序中还有任何非守护线程运行,Java程序也就继续运行,即虚拟机还活着。当程序中所有非守护线程都终止,虚拟机将自动消亡。

虚拟机内部机构:
虚拟机内部结构
类加载子系统:负责查找并加载类型数据(类型数据的回收,有垃圾回收负责)。
执行引擎:解析,执行具体指令的部分,Java程序中,每个线程都有属于它自己的独立执行引擎实例,随线程开始运行而生,线程任务结束而消亡。
本地方法接口:用于调用本地机器的接口,Java虚拟机规范并不强求虚拟机支持任何特定的本地接口。
运行时数据区:
方法区:线程共享,存储类信息,静态变量,常量,到classload的引用,到Class对象的引用。
堆:线程共享,存储所有的对象实例,数组。但由于JIT(及时编译器)的发展和逃逸分析技术成熟,栈上分配等优化技术,有些对象不一定在堆上分配。
Java栈:线程私有,每当启动一个线程时,Java虚拟机会为它分配一个Java栈,Java栈有栈帧组成,线程中的每个方法,对应一个栈帧。随着Java方法的调用,虚拟机创建栈帧并压栈;Java方法调用返回或异常结束,虚拟机对栈帧出栈。
本地方法栈:线程私有,与Java栈功能一样,记录本地方法的调用情况。
PC计数器:线程私有,记录当前线程当前指令地址。

参考文献:
《深入Java虚拟机第二版》
《深入理解Java虚拟机-Java告警特性与最佳时间》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值