Java 程序内部是如何执行的?
作者:Blackja 时间:2022-04-29 20:18:36
我们日常的工作中都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通过打包工具把项目打包成 jar 包或者 war 包,放入 Tomcat 等 Web 容器中就可以正常运行了,但你有没有想过 Java 程序内部是如何执行的?
其实不论是在开发工具中运行还是在 Tomcat 中运行,Java 程序的执行流程基本都是相同的,它的执行流程如下:
先把 Java 代码编译成字节码,也就是把 .java 类型的文件编译成 .class 类型的文件。这个过程的大致执行流程:Java 源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字节码生成器 -> 最终生成字节码,其中任何一个节点执行失败就会造成编译失败;
把 class 文件放置到 Java 虚拟机,这个虚拟机通常指的是 Oracle 官方自带的 Hotspot JVM;
Java 虚拟机使用类加载器(Class Loader)装载 class 文件;
类加载完成之后,会进行字节码校验,字节码校验通过之后 JVM 解释器会把字节码翻译成机器码交由操作系统执行。但不是所有代码都是解释执行的,JVM 对此做了优化,比如,以 Hotspot 虚拟机来说,它本身提供了 JIT(Just In Time)也就是我们通常所说的动态编译器,它能够在运行时将热点代码编译为机器码,这个时候字节码就变成了编译执行。
Java 虚拟机是如何判定热点代码的?
Java 虚拟机判定热点代码的方式有两种:
基于采样的热点判定
主要是虚拟机会周期性的检查各个线程的栈顶,若某个或某些方法经常出现在栈顶,那这个方法就是“热点方法”。这种判定方式的优点是实现简单;缺点是很难精确一个方法的热度,容易受到线程阻塞或外界因素的影响。
基于计数器的热点判定
主要就是虚拟机给每一个方法甚至代码块建立了一个计数器,统计方法的执行次数,超过一定的阀值则标记为此方法为热点方法。
Hotspot 虚拟机使用的基于计数器的热点探测方法。它使用了两类计数器:方法调用计数器和回边计数器,当到达一定的阀值是就会触发 JIT 编译。
方法调用计数器:在 client 模式下的阀值是 1500 次,Server 是 10000 次,可以通过虚拟机参数: -XX:CompileThreshold=N
对其进行设置。但是JVM还存在热度衰减,时间段内调用方法的次数较少,计数器就减小。
回边计数器:主要统计的是方法中循环体代码执行的次数。
来源:https://blog.csdn.net/qq_35538405/article/details/107221536
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android ListView的Item点击效果的定制
Java 阻塞队列和线程池原理分析
![](https://img.aspxhome.com/file/2023/3/81993_0s.png)
Spring Boot环境属性占位符解析及类型转换详解
![](https://img.aspxhome.com/file/2023/4/66524_0s.png)
springboot自动扫描添加的BeanDefinition源码实例详解
![](https://img.aspxhome.com/file/2023/3/59943_0s.png)
Android如何判断一个点在不在多边形区域内
![](https://img.aspxhome.com/file/2023/2/83522_0s.jpg)
java实现的n*n矩阵求值及求逆矩阵算法示例
![](https://img.aspxhome.com/file/2023/1/86711_0s.png)
Maven分模块开发执行指令失败的问题
![](https://img.aspxhome.com/file/2023/0/72560_0s.jpg)
Java中的匿名对象定义与用法实例分析
SpringCloud重试机制配置详解
![](https://img.aspxhome.com/file/2023/0/69710_0s.png)
C#实现对AES加密和解密的方法
Java使用GZIP压缩导致HTTP请求返回乱码问题解决
介绍Jersey-Jersey入门基础
利用HorizontalScrollView实现滑动页面时的缩放效果
![](https://img.aspxhome.com/file/2023/3/88113_0s.gif)
Springcloud-nacos实现配置和注册中心的方法
mybatis-plus 如何判断参数是否为空并作为查询条件
![](https://img.aspxhome.com/file/2023/8/61078_0s.jpg)
学习Winform文本类控件(Label、Button、TextBox)
![](https://img.aspxhome.com/file/2023/5/86985_0s.png)
Java中方法的使用、重载与递归的详细介绍
![](https://img.aspxhome.com/file/2023/8/60928_0s.png)
IDEA标签tabs多行显示的设置
![](https://img.aspxhome.com/file/2023/9/81999_0s.jpg)
Java IO流之节点流与字符流的相关知识总结
浅谈自定义校验注解ConstraintValidator
![](https://img.aspxhome.com/file/2023/9/61529_0s.jpg)