Java背后的秘密之虚拟机的组成部件02

  想要深入学习Java虚拟机的知识,首先得看一看虚拟机的组成部件。它有哪几部分构成,各部分都有什么作用与联系。我们都知道Java虚拟机是模拟了一台硬件计算机,可以想象成Java虚拟机就是一台硬件计算机,它拥有内存、cpu、输入/输出、网卡等。下面这张图片展示了虚拟机的组成:



        Java一推出,就打着跨平台的旗号。其原理就是将目标文件编译成Java字节码文件,通过虚拟机去解释执行,最终会被编译成目标系统对应的指令。比如Windows、Linux、Mac OS平台上都有SUN实现的虚拟机,但是每个平台去解释其字节码文件时,字节码文件都是一样的,只是最终生成的底层机器指令不一样。由此可见,Java跨平台是令人可笑的,但是这种思想却是伟大的。这也是很多人抱怨Java语言效率低的问题源头。

上图中,JVM主要包括两个子系统和两个组件。两个子系统分别是CLASS LOADER(类装载器)子系统和EXECUTION ENGINE(执行引擎)子系统。两个组件分别是RUNTIME DATA AREA(运行时数据区域)和NATIVE INTERFACE(本地接口)组件。

CLASS LOADER子系统:这个可以想象成硬件计算机中的I/O设备,根据给定的全限定名类名(如java.lang.Object)来装载class文件的内容到RUNTIME DATA AREA中的METHOD AREA(方法区域)。Java程序员可以继承java.lang.ClassLoader类来写自己的ClassLoader。

EXECUTION ENGINE子系统:这个可以想象成一台计算机的CPU,执行Java编译后的.class文件中的指令。JVM有很多种实现,如SUN公司的JDK、IBM的JDK、开源的opensdk、Android的dalvik虚拟机。任何JVM的实现JDK核心都是EXECUTION ENGINE子系统,不同JDK的好坏主要就是取决于各自实现的EXECUTION ENGINE的好坏。

NATIVE INTERFACE组件:这个可以想象成计算机中的网卡,做过Android的可能知道JNI,本地接口组件就是允许Java去调用底层C、C++的一些实现,与本地的一些类库去交互。当调用native方法的时候,就进入了一个全新的并且不再受Java虚拟机限制的世界,所以也很容易出现JVM无法控制的native heap OutOfMemory

RUNTIME DATA AREA组件:这个可以想象成计算机中的内存,也是我们常说的JVM内存,它通常分为5个部分:
1.METHOD AREA方法区:被装载的Java类信息,也就是字节码信息存放于此;
2.JAVA STACK栈空间:用于存放每个运行的Java线程的局部变量、操作数、中间结果、以及执行上下文信息(JDK5.0之前大小为256K,之后为1M);
3.NATIVE METHOD STACK本地方法栈:保存本地方法进入区域地址;
4.HEAP堆空间:用来存放Java实例对象;
5.PROGRAM COUNTER REGISTER程序计数器:每一个Java线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量;

以上5部分只有HEAP和METHOD AREA是被所有线程共享使用的;而其他三个都是以线程为粒度的,每个线程独自拥有自己的部分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值