为什么一条Java命令,JVM就可以执行Java程序了(串联JVM面试知识点)

文章目录

  • 前言
  • 从面试题说起
  • JVM做了哪些事?
    • “翻译”的工作
    • 不仅仅“翻译”
  • JVM 各部件如何协同工作?
    • 类加载器先工作
    • 执行引擎开始工作
      • 执行引擎工作模式
      • Main方法什么时候被执行?
    • 运行时数据区域开始工作
      • 线程私有的空间
      • 大名鼎鼎的堆内存
    • 就这么一直工作
  • 以面试题结尾

前言

如果你对JVM一知半解,如果你想了解JVM的工作流程,如果你知道一些JVM面试题却无法将知识点串联起来,那么这篇文章非常适合你。

从面试题说起

这些面试题Javaer们应该都很熟悉,但是你知道这些面试题的背后吗?

  • 你知道类加载机制吗?
  • 什么是双亲委派机制?
  • 介绍一下JVM内存区域划分
  • 堆为什么要分代设计?
  • 什么是内存的担保机制?
  • 为什么Eden:S0:S1 比例是8:1:1?
  • 描述一下对象内存分配过程
  • 如何判断对象已死?
  • 讲一讲内存模型?
  • 常用的JVM调优参数有哪些?
  • 常用的垃圾回收算法有哪些?
  • 常用的垃圾收集器有哪些?

如果你总是背了又忘,忘了又背,归根结底,还是对JVM没有一个系统的认识。

那么希望通过这篇文章,可以为你构建一个连贯的JVM框架。

JVM做了哪些事?

众所周知,高级编程语言编写的程序,最终要转化为机器码,才可以在计算机上运行。

我们在编写完一段Java代码后,如果想要运行它,需要通过Java编译器,将其编译为JVM认识的字节码文件。

在这里插入图片描述

然后执行Java命令,这段代码就会通过JVM运行。

“翻译”的工作

在这个过程中,JVM就充当了转换的角色,负责将字节码,翻译成对应平台上的机器指令。这样的话,Java程序就可以在任何安装了JVM的平台上运行。这就是Java语言一次编写到处运行的跨平台特性。

翻译字节码的工作,是由JVM的执行引擎完成。

不仅仅“翻译”

在将字节码翻译为机器指令之前,JVM还有一个非常重要的工作,那就是将字节码文件中的二进制数据准确的加载到JVM中。这个工作是由JVM的类加载系统完成,

另外,为了在运行时方便管理内存,JVM定义了一个专门的区域,也就是大名鼎鼎的运行时数据区

在这里插入图片描述

所以,类加载系统、运行时数据区、执行引擎,就构成了JVM平台。

接下来,看一下它们是如何工作的。

在这之前,要对字节码现有一个认识,毕竟它贯穿了Java代码运行的整个流程。

Java虚拟机对Java编程语言一无所知,只知道一种特定的二进制格式,即类文件格式。类文件包含Java虚拟机指令(或字节码)和符号表,以及其他辅助信息。

JVM 各部件如何协同工作?

类加载器先工作

类加载系统目的很明确,就是将字节码文件中的二进制数据准确地加载到JVM,从Class文件加载到内存 & 对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java使用类型

执行Java命令后,Java虚拟机启动,类加载系统就开始工作了。

类加载系统首先会读取指定的类文件,并遵循双亲委派机制进行加载。

然后将文件中的常量池、字段、方法和指令等数据加载到JVM内存的共享区域方法区中。

然后对其进行验证,目的是为了确保类的正确性。比如版本号为52或更高时,不应该存在这个版本不支持的指令。

或者标识类文件的魔术数字是不是cafebabe,这些完整性的检查和约束都是非常有必要,就像我们自己开发的应用,也不可能随便让别人访问一样。

验证完成后,在方法区为类的静态变量分配内存并设置默认值。

紧接着,将常量池中表示对象的符号引用,指向到实际的内存地址,也就是直接引用。

什么是符号引用呢?

符号引用是常量池中的类、方法、字段等指向的目标在字节码文件中的静态表示,当JVM运行时,需要将目标的静态表示转换成实际的内存指针,也就是直接引用。
在这个例子中,如果JVM需要加载Object这个类,它会查找常量池中的#3(Class类型,指向#27),然后解析#27中的字符串java/lang/Object/为实际的类文件路径,并加载这个类。

最后执行静态代码块,为静态变量设置初始值,类加载工作就算完成了。

整个加载过程就是面试被经常问到的类加载机制。

那么问题来了:静态变量为什么要先设置默认值,再设置初始值,知道的评论区留言。

执行引擎开始工作

执行引擎工作模式

静态代码块被执行时,执行引擎就会处理这些指令。执行引擎有两种工作模式:

  • 解释执行
  • 即时编译

解释执行就是每次执行都会逐行解释字节码指令

即时编译是将热点代码,编译成当前平台的机器码,并缓存下次就可以直接执行机器码,这样就可以提高执行效率。

JVM通常采用解释器与即时编译器并存的混合模式。在程序启动时,解释器可以立即发挥作用,省去编译时间;随着程序运行时间的推移,JIT编译器逐渐发挥作用,将越来越多的热点代码编译为本地机器码,以提高执行效率。

Main方法什么时候被执行?

静态代码块执行完成后,JVM会继续调用main方法。如果执行Java命令的字节码文件中没有main方法,JVM就会报错,这个是JVM规范。

运行时数据区域开始工作

执行引擎工作期间,会和运行时数据区域有大量的交互。

线程私有的空间

调用main方法时,会创建一个线程并在运行时数据区中分配线程私有的空间:栈帧以及程序计数器。

程序计数器初始时会指向第一条指令, 然后随着指令的执行而递增。

执行静态变量赋值的指令时,会把整数推送到栈帧中的操作数栈,随后赋值给静态变量。

在执行创建一个Object实例的指令时,如果Object Class未被加载,类加载器会启动加载过程。
然后在堆中分配一块内存并初始化实例。

大名鼎鼎的堆内存

分配内存这个过程,就涉及到“堆内存分代设计”、“对象内存分配过程”、“内存分配方式”等知识点了。

如果对象过多导致空间不足,JVM就会通过垃圾回收来释放一些空间。“如何确定对象是垃圾”、“使用哪个垃圾回收器”、“用了什么回收算法”就需要我们去了解。

实例初始化后,会将对象的引用存储到局部变量表中。这样的话,线程就可以通过引用访问到该对象。

就这么一直工作

后续的代码会延续这个流程,该加载类的加载类、该翻译指令的翻译、该分配内存的分配、该回收垃圾的回收,直到Java虚拟机停止工作。

以面试题结尾

JVM的工作流程大概就是这样,如果对JVM工作流程中的某个知识点感兴趣,欢迎访问hicxy.cn前往了解或者评论区交流,感谢大家的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/453403.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FineReport 条件属性

条件属性主要指:给报表的属性添加条件,当满足该条件时,对属性的属性值进行修改,从而达到改变报表样式的目的。 条件属性共有 12 种,分别是:颜色、字体、超级链接、形态、缩进、行高、分页、列宽、背景、边框…

Oracle 使用位图索引 Cost降低200倍! 探讨位图索引的利与弊

一.简介 位图索引(Bitmap Index) 是 Oracle 数据库中一种特殊类型的索引,适用于低基数(Low Cardinality)列,即那些列中可选值相对较少的情况下使用。它与常规的 B-tree 索引不同,位图索引通过位…

Columns Page “列”页面

“列”页提供了列管理工具,其中包括用于添加和删除列的按钮、显示绑定数据源中字段名称的列表框以及网格列、提供对所选列属性的访问的属性网格。 Columns 页面提供 Column properties (列属性)、Column options (列选项&#xff…

【Git】远程操作-标签管理-多人协作

远程操作 分布式版本控制系统 概念理解 Git就像正在看的一本书。每当看完一章,可以将其保存起来,如果后面想修改或者查看以前自己看到哪里,随时可以翻看。Git就是帮助记录这些修改的工具,主要负责记录每次改动,就类似…

AnaTraf | 网络质量分析与DNS响应时间

http://www.anatraf.com 在当今的数字化时代,网络是任何企业正常运转的核心。而网络的质量直接影响着业务的连续性和用户体验。当网络性能不佳时,可能会导致网站加载缓慢、应用响应滞后,甚至影响企业的生产力。特别是在互联网世界中&#xf…

第三季度中国游戏市场收入创历史新高;京东物流与淘宝天猫达成合作;YouTube 上线“用相机拍摄”标签....|网易数智日报

第三季度中国游戏市场收入917.66亿,创历史新高 中国音数协游戏工委今日发布了最新的 2024 年第三季度中国游戏产业季度报告。 数据显示,2024 年第三季度中国游戏市场收入 917.66 亿元,环比增长 22.96%,同比增长 8.95%。 中国音…

【H2O2|全栈】JS入门知识(五)

目录 JS 前言 准备工作 数组API(一) API概念 数组常见API(一) arguments 作用域 概念 全局作用域 局部作用域 块级作用域 变量的作用域 作用域链 案例 预解析 概念 变量预解析 函数预解析 案例 对象 概念 …

【RTT-Studio】详细使用教程十七:FreeModbus通信--LCD

文章目录 一、简介二、Modbus通信三、LCD通信四、配置FreeModbus通信协议四、完整代码五、测试验证 一、简介 Modbus协议是一种用于工业控制的网络通讯协议,可以片面的理解为,Modbus协议一种机器与机器之间进行数据、信息传递的一种格式规范。   Modbu…

PostgreSQL的学习心得和知识总结(一百五十五)|[performance]优化期间将 WHERE 子句中的 IN VALUES 替换为 ANY

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

《MYSQL实战45讲 》 优化器如何选择索引?

SHOW VARIABLES LIKE long_query_time; set long_query_time0 优化器如何选择索引? 1.扫描的行数 估计出各个索引大致的要扫描的行数,行数越少,效率越高。 索引的基数也叫区分度,就是这个索引所在的字段上不同的值又多少个。优…

MySQL【知识改变命运】06

前言:在05这节数据结构里面,我们知道select * from 这个操作很危险,如果数据库很大,会把服务器资源耗尽,接下来提到的查询可以有效的限制返回记录 1:分页查询 分页查询可以有效控制一次查询出来的结果集的…

数据结构与集合源码

目录 一、数据结构 1.1 数据结构概念 1.2 研究对象 1.3 常见存储结构 1.3.1 数组 1.3.2 链表 1.单向链表 2.双向链表 1.3.3 二叉树 1.3.4 栈(FILO,先进后出) 1.3.5 队列(FIFO,先进先出) 二、集合…

基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili (一)简介 基于卷积神…

Java设计模式梳理:行为型模式(策略,观察者等)

行为型模式 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。 策略模式 策略模式太常用了,所以把它放到最前面进行介绍。它比较简单,我就不废话,直接用代码说事吧。 下面设计的…

软件架构之构件复用技术

简介 软件架构复用 在应用软件系统的开发过程中,通常包含以下几个关键阶段:需求分析、设计、编码、测试和维护。在这些阶段中,复用技术均可以得到有效应用。特别是,软件架构复用作为一种大粒度、高抽象级别的复用方式&#xff0…

55 | 享元模式(下):剖析享元模式在Java Integer、String中的应用

上篇文章,我们通过棋牌游戏和文本编辑器这样两个实际的例子,学习了享元模式的原理、实现以及应用场景。用一句话总结一下,享元模式中的“享元”指被共享的单元。享元模式通过复用对象,以达到节省内存的目的。 今天,我…

[PHP]重复的Notice错误信息

<?php $a []; var_dump($a[name]);执行结果&#xff1a; 原因&#xff1a; display_errors和error_reporting都打开了Notice错误信息

线性回归实现

1.从数据流水线、模型、损失函数、小批量随机梯度下降优化器 %matplotlib inline import random import torch from d2l import torch as d2l 2.根据带有噪声的线性模型构造人造数据集。使用线性模型参数w [2,-3.4]T、b 4.2和噪声项ε生成数据集及标签 y Xw b ε def …

windows 上验证请求接口是否有延迟

文件名&#xff1a;api_request_script.bat &#xff0c;直接右键点击执行即可。 echo off setlocal:: 配置:: 替换为实际接口URL set "logFilelog.txt" set "errorLogFileerror_log.txt" set "interval3" :: 请求间隔&#xff08;秒&#xff…

React之组件渲染性能优化

关键词&#xff1a; shouldComponentUpdate、PureComnent、React.memo、useMemo、useCallback shouldComponentUpdate 与 PureComnent shouldComponentUpdate 与 PureComnent 用于类组件。虽然官方推荐使用函数组件&#xff0c;但我们依然需要对类组件的渲染优化策略有所了解…