Java代码是如何运行的(run time data area & JVM Instructions)

一、为什么要有Java虚拟机(好处)

  • 一次编译,处处运行,将java代码编译成java字节码(JVM中的字节码指令的操作码是一个个为字节单位的),JVM再把java字节码编译成计算机能识别的机器码然后运行;
  • 提供java代码的内存管理,也就是垃圾回收
  • 提供编写代码时的异常检测

二、JVM怎么执行java方法

基本流程如下:

读取方法区.Class字节码中的java方法 —— 在栈中开辟一个栈帧(不连续)存放该线程执行该方法时要用的局部变量 ——JVM将方法的java字节码翻译成机器码交给计算机执行(解释执行或者即时编译,HotSpot采用两者混合形式) ——退出当前方法,JVM弹出方法的栈帧

如下图所示:
请添加图片描述

栈帧存放内容:

  1. 局部变量表 Local Variable Table
  2. 操作数栈 Oper and Stack
  3. 动态链接 Dynamic Linking 方法a中调用了方法b,则方法a栈帧中会指向.class文件中方法b的符号引用
  4. 方法返回值地址 return address 方法a中调用的方法b返回的值存放的地址

栈的执行流程:指令集

请添加图片描述

三、解释执行和即时编译

  • 解释执行同声翻译,读一句字节码,翻译成一句机器码,然后立马执行,只有程序执行到该处才会转换成机器码,无需再内存中保存(优点:不需要等待编译完成再执行,不占内存空间);

  • 即时编译:以方法为单位,读取整个方法的字节码,然后统一翻译成机器码再执行,会将编译结果存放在内存中,可以重复读取执行,避免重复编译(优点:运行速度更快,因为它编译了整段程序块,可以进行代码的整体优化);

  • HotSpot解释执行和即时编译混合使用,先实时解释执行代码,然后统计多次被调用的热点方法块,对他们进行即时编码的优化。(理论上Java程序执行效率可以比静态编译的C++更快,因为可以根据即时编译来优化编译速度);

  • HotSpot设置了多个即时编译器,面向用户对启动性能以及执行效率有不同需求时调用。而且即时编译器有专用的线程来执行,不影响主线程的执行。

四、JVM虚拟机运行时数据域

请添加图片描述
method area在1.8以前FGC不回收内存,1.8以后才清理内存空间,1.8后metaspace位于堆外内存,大小可调并受限于服务器硬件的内存空间(主要存放class的metadata,Spring动态代理等生成的代理类等),1.8后String常量存放在堆内存中;

参考文章:

https://time.geekbang.org/column/article/11289

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值