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 虚拟机是如何判定热点代码的?

Java 虚拟机判定热点代码的方式有两种:

  • 基于采样的热点判定

主要是虚拟机会周期性的检查各个线程的栈顶,若某个或某些方法经常出现在栈顶,那这个方法就是“热点方法”。这种判定方式的优点是实现简单;缺点是很难精确一个方法的热度,容易受到线程阻塞或外界因素的影响。

  • 基于计数器的热点判定

主要就是虚拟机给每一个方法甚至代码块建立了一个计数器,统计方法的执行次数,超过一定的阀值则标记为此方法为热点方法。

Hotspot 虚拟机使用的基于计数器的热点探测方法。它使用了两类计数器:方法调用计数器和回边计数器,当到达一定的阀值是就会触发 JIT 编译。

方法调用计数器:在 client 模式下的阀值是 1500 次,Server 是 10000 次,可以通过虚拟机参数: -XX:CompileThreshold=N 对其进行设置。但是JVM还存在热度衰减,时间段内调用方法的次数较少,计数器就减小。

回边计数器:主要统计的是方法中循环体代码执行的次数。

来源:https://blog.csdn.net/qq_35538405/article/details/107221536

标签:java,程序,执行
0
投稿

猜你喜欢

  • Java 定时器(Timer,TimerTask)详解及实例代码

    2022-08-17 20:03:11
  • 关于activemq安装配置以及启动错误的解决

    2023-11-13 05:18:02
  • Java为什么占用四个字节你知道吗

    2021-06-16 18:05:22
  • Android实现传感器功能

    2022-05-26 02:50:10
  • Java 实战项目之毕业设计管理系统的实现流程

    2021-12-26 00:10:10
  • 利用Java计算某个日期是星期几

    2023-11-17 05:49:42
  • jsp如何获取Session中的值

    2023-07-01 05:59:28
  • C# 中将数值型数据转换为字节数组的方法

    2023-09-29 05:46:17
  • SpringCloud之分布式配置中心Spring Cloud Config高可用配置实例代码

    2021-06-23 16:48:08
  • C#操作PowerPoint的方法

    2023-03-17 03:48:16
  • Java实现读写文件功能的代码分享

    2023-02-07 04:07:02
  • java集合框架的体系结构详细说明

    2021-10-24 10:33:29
  • java实现KFC点餐系统

    2021-09-06 11:36:34
  • Spring AOP AspectJ使用及配置过程解析

    2023-09-29 00:17:45
  • Java中char[]输出不是内存地址的原因详解

    2022-08-04 11:00:11
  • 详解Kotlin中的面向对象(二)

    2021-12-29 03:10:00
  • Android DataBinding类关系深入探究

    2022-08-17 19:23:51
  • C# double和decimal数据类型以截断的方式保留指定的小数位数

    2021-12-09 02:19:04
  • C#机器入门学习之判断日报是否合格详解

    2023-03-24 01:55:08
  • 基于android中权限的集合汇总

    2023-04-06 09:32:35
  • asp之家 软件编程 m.aspxhome.com