BAT面试必问的 JVM 调优

Java架构师面试题——JVM性能调优[通俗易懂] 大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Java架构师面试题——JVM性能调优[通俗易懂],希望能够帮助大家进步!!!] 阅读详情

概述

很多人想要到阿里巴巴、美团、京东等互联网大公司去面试,但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验,毕竟线上系统写好代码部署之后,每个工程师都必须关注JVM相关的东西,比如OOM、GC等问题.

所以一起来看看JVM的最基本的区域划分以及工作原理,这个基本上是互联网公司面试必问。

区域划分

jvm的区域划分如下所示:

大致就是分为:程序计数器,虚拟机栈,堆,方法区,本地方法栈,这几个部分。

接下来我们从自己写好的Java代码如何通过JVM来运行的角度,来分析一下JVM里这些区域是如何支撑我们的Java代码跑起来的。

程序计数器

假设我们有如下的一个类,就是最最基本的一个HelloWorld而已:

上面那段代码首先会存在于 “.java” 后缀的文件里,这个文件就是java源代码文件,但是这个文件是面向我们程序员的,计算机他是看不懂你写的这段代码的

所以此时就得通过编译器,把“.java”后缀的源代码文件编译为“.class”后缀的字节码文件。

这个“.class”后缀的字节码文件里,存放的就是对你写出来的代码编译好的字节码了,这个字节码才是计算器可以理解的一种语言,而不是我们写出来的那一堆代码。

这个字节码看起来大概是下面这样的:

这段字节码并不是完全对照着HelloWorld那个类来写的,就是给一段示例,让大家知道“.java”翻译成的“.class”是大概什么样子的。

这里比如说“0: aload_0”这样的,就是“字节码指令”,他对应了一条一条的机器指令,计算机只有读到这种机器码指令,才知道具体应该要干什么。

比如说字节码指令可能会让计算机从内存里读取某个数据,或者把某个数据写入到内存里去,都有可能,各种各样的指令,就会指示计算机去干各种各样的事情。

所以现在首先明白一点,我们写好的Java代码是会被翻译成字节码的,对应各种字节码指令。

那么Java代码通过JVM跑起来的第一件事情就明确了, 首先Java代码被编译出来的字节码指令一定会被一条一条的执行,这样才能实现我们写好的代码被执行的效果。

那么在执行字节码指令的时候,JVM里的程序计数器就是用来记录每个线程当前执行的字节码指令的位置的,记录当前线程目前执行到了哪一条字节码指令。

因为会有多个线程来并发的执行各种不同的代码,所以每个线程都有自己的一个程序计数器,专门记录当前这个线程目前执行到了哪一条字节码指令了

下图更加清晰的展示出了他们之间的关系。

Java虚拟机栈

Java代码在执行的时候,一定是线程来执行某个方法中的代码,比如哪怕就是上面的那个最基础的HelloWorld代码,也会有一个main线程来执行main方法里的代码。

在方法里,经常会定义一些方法内的局部变量,比如下面这样,就在方法里定义了一个局部变量“name”。

所以JVM必须有一块区域是来保存每个方法内的局部变量等等数据的,这个区域就是Java虚拟机栈

每个线程都会去执行各种方法的代码,方法内还会嵌套调用其他的方法,所以首先每个线程都有自己的Java虚拟机栈。

如果线程执行了一个方法,那么就会被这个方法调用创建对应的一个栈帧,栈帧里就有这个方法的局部变量表 、操作数栈、动态链接、方法出口等东西,但是这里别的不太好理解,先理解一个局部变量就可以。

比如说一个线程调用了上面写的“sayHello”方法,那么就会为“sayHello”方法创建一个栈帧,压入线程自己的Java虚拟机栈里面去。

在栈帧的局部变量表里就会有“name”这个局部变量,下图展示了这个过程。

接着如果“sayHello”方法调用了另外一个“greeting”方法 ,比如下面那样的代码:

那么这个时候会给“greeting”方法又创建一个栈帧压入线程的Java虚拟机栈里,因为开始执行“greeting”方法了,而且“greeting”方法的栈帧的局部变量表里会有一个“greet”变量,这是“greeting”方法的局部变量。

接着如果“greeting”方法执行完毕了,就会把“greeting”方法对应的栈帧从Java虚拟机栈里给出栈,然后如果“sayHello”方法也执行完毕了,就会把“sayHello”方法也从Java虚拟机栈里出栈。

这就是JVM中的 “Java虚拟机栈 ” 这个组件的作用,调用执行任何方法的时候,都会给方法创建栈帧然后入栈。

而在栈帧里存放了这个方法对应的局部变量之类的数据,包括这个方法执行的其他相关的信息,方法执行完毕之后就出栈。

Java堆内存

JVM中有另外一个非常关键的区域,就是Java堆,这里就是存放我们在代码中创建的各种对象的,比如说下面的代码:

上面的 “new Student(name)” 这个代码就是创建了一个Student类型的对象实例,这个对象实例里面会包含一些数据。

比如说这个Student的“name”就是属于这个对象实例的一个数据,那么类似Student这样的对象,就会存放在Java堆内存里。

Java堆内存区域里会放入类似Student的对象,然后方法的栈帧的局部变量表里,这个引用类型的“student”局部变量就会存放Student对象的地址。

相当于你可以认为局部变量表里的“student”指向了Java堆里的Student对象。

看下图会更加清晰一些。

方法区 / Metaspace

这个方法区是在JDK 1.8以前的版本里,代表JVM中的一块区域,主要是放类似Student类自己的信息的,平时用到的各种类的信息,都是放在这个区域里的,还会有一些类似常量池的东西放在这个区域里。

但是在JDK 1.8以后,这块区域的名字改了,叫做“Metaspace”,可以认为是“元数据空间”这样的意思,这里当然主要其实还是存放我们自己写的各种类相关的信息。

本地方法栈

其实在JDK很多底层API里,比如IO相关的,NIO相关的,网络Socket相关的,如果大家去看他内部的源码,会发现很多地方都不是Java代码了。

很多地方都会去走native方法,去调用本地操作系统里面的一些方法,可能调用的都是c语言写的方法,或者一些底层类库,比如下面这样的:

public native int hashCode();

在调用这种native方法的时候,就会有线程对应的本地方法栈,这个里面也是跟Java虚拟机栈类似的,也是存放各种native方法的局部变量表之类的信息。

堆外内存

还有一个区域,是不属于JVM的,通过NIO中的allocateDirect这种API,可以在Java堆外分配内存空间。

然后通过Java虚拟机里的 DirectByteBuffer 来引用和操作堆外内存空间,其实很多技术都会用这种方式,因为有一些场景下,堆外内存分配可以提升性能。

总结

最后做一点总结,我们的Java代码通过JVM来运行的时候,首先一定会一行一行执行编译好的字节码指令。

然后在执行的过程中,对于方法的调用,会通过Java虚拟机栈来为每个方法创建栈帧入栈和出栈,而且栈帧里有方法的局部变量表

接着对于对象的创建,会分配到Java堆内存里去

对于类信息的存储,会放在方法区 / Metaspace这样的区域里。

另外有两块特殊的区域:

        ·     本地方法栈,是执行native方法时候用的栈,跟Java虚拟机栈是类似的

        ·     堆外内存,是可以在Java堆外分配内存空间来存储一些对象。

看我主页领取资料,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的资料

 

JVM 源代码part1 JVM 源代码part1 (看我的上传记录 有1--9 个part) 立即下载

相关推荐

300Kg载重履带式无人车底盘定制开发技术详解

通过精准的需求分析、科学的方案设计、严格的研发与测试以及完善的交付与培训流程,可以打造出符合客户需求的优质产品。300Kg载重履带式无人车底盘的定制开发,旨在打造一款承载能力强、行驶稳定、适应复杂地形的无人运输平台。根据应用场景选择合适的动力源,并进行性能优化,确保无人车在载重情况下仍能保持稳定的行驶速度和动力输出。根据需求分析结果,设计无人车底盘的总体方案,包括动力系统选择、结构设计、负载管理策略等。进行详细的研发工作,包括零部件的选型与采购、样机的制作与调试等。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 958

想要去阿里面试?你必须得知道JVM-运行时数据区!

目录 概述 区域划分 程序计数器 Java虚拟机栈 Java堆内存 方法区 / Metaspace 本地方法栈 堆外内存 总结 概述 很多人想要到阿里巴巴、美团、京东等互联网大公司去面试,但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验,毕竟线上系统写好代码部署之后,每个工程师都必须关注JVM相关的东西,比如OOM、GC等问题. 所以一起来看看JVM的最...

凡是过往,皆为序章 530

一文详解本地知识库RAG(检索增强):LangChain + Hugging Face 三件套 + 本地大模型 + MCP 协议 + Chroma + Agent 全流程实战

模型上下文协议(MCP)是 Anthropic 推出的开放标准,基于 JSON-RPC 2.0,为 AI 应用与外部工具/数据源之间提供统一的双向通信协议,被称为“AI 应用的 USB-C”。LangChain 是一个围绕 LLM、提示模板(Prompts)、记忆(Memory)、链(Chains)、工具(Tools)和代理(Agents)等组件打造的开源框架,旨在简化复杂自然语言应用的开发。:任意可调用的功能或服务(API、数据库查询、本地函数等),由 Agent 或 Chain 在推理过程中调用。

weixin_41645791的博客 1424

通过java程序运行过程来了解JVM原理

今天这篇文章我们具体分析一下java程序运行起来之中所包含的具体细节,通过这些细节带我们窥探JVM实现的原理。 一、前端编译 使用javac命令将.java程序编译为JVM可解析的.class字节码文件,java作为一种解释型编程语言(当然这么说带有片面性,jvm自带的即时编译器同样可以将字节码直接编译为机器码运行,但是这里我们就不分析即时编译器是如何运行的了),负责将字节码翻译为机器码运行,...

派大星的博客 383

解决Unity与3DMax模型单位与中心点偏差的完整指南

本文详细解析了Unity与3DMax模型导入时常见的单位与中心点偏差问题,提供了从3DMax单位设置、FBX导出到Unity接收调整的完整解决方案。通过实战案例和高效工作流建议,帮助开发者实现unity与3dmax的单位统一,避免尺寸错误和轴心偏移,提升3D资源导入效率。

weixin_29015899的博客 283

DTI-ALPS处理笔记

前段时间刚好学习了一下DTI-ALPS处理(diffusion tensor image analysis along the perivascular space ),记录一下,以便后续学习。ALPS是2017年发表在《Japanese Journal of Radiology》的一篇文章首次提出的 (),主要用于无创评估脑内淋巴系统功能的衡量数值。C图和D图中的蓝色部分是投射纤维,绿色部分是联合纤维,红色部分是皮下纤维。

weixin_52073820的博客 4788

不扯概念,用图示和代码理解JVM

这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。语言无关性是指实现了Java虚拟机规范的语言可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件符合规范就可以在JVM上运行。方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

Park33的博客 220

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 177

这一次,彻底解决Java的值传递和引用传递

本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有;这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍、对论坛博客的说法,做一次考证,以得出信得过的答案。 其...

weixin_34174322的博客 1万+

Linux ARM平台开发系列讲解(网络篇)1.3 MDIO总线设备device和设备driver匹配

在设备和驱动都载入内核后,设备和驱动是如何匹配起来的呢?其实他们就是通过的唯一标识phyID进行匹配phy_dev和phy_drv是通过phy_bus_match函数进行匹配,匹配成功后会建立链表链接,具体流程如下图: 返回总目录......

DSMGUOGUO的博客 1098

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的生活垃圾检测与分类系统(Python+PySide6界面+训练代码)

随着城市化进程的加速和人口增长,生活垃圾管理已成为现代城市面临的重要挑战。传统的垃圾处理方法效率低下且成本高昂,急需智能化解决方案。本文详细介绍了基于YOLO系列算法(特别是YOLOv8)的智能生活垃圾检测与分类系统,该系统能够实时识别和分类多种生活垃圾,为智能垃圾处理和回收提供技术支持。系统包含完整的数据集构建、模型训练、评估和可视化界面,并提供了完整的实现代码。

YOLO 116

jvm深度学习(6):实例代码运行JVM内存处理全流程、堆的垃圾回收、栈优化技术

实例代码运行JVM内存处理全流程 提问:当一个实例在运行时我们的JVM究竟发生了什么? 先写个代码,然后运行 public class JVMObject { public final static String MAN_TYPE = "man"; // 常量 public static String WOMAN_TYPE = "woman"; // 静态变量 public static void main(String[] args)throws Exceptio...

TofuCai的博客 354

RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件

Davinci Configurator配置工程导入DBC与CDD文件,开始Autosar开发

weixin_42412049的博客 8146

java等待5秒_Java互联网架构-BAT面试100%必问JVM调优

欢迎关注头条号:java小马哥周一至周日下午三点半!精品技术文章准时送上!!!精品学习资料获取通道,参见文末JVM 调优概述性能定义吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。内存占用 - 垃圾收集器流畅运行所需要的内存数量。调优原则G...

weixin_39956350的博客 430

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java 设置周一时间_Java互联网架构-BAT面试100%必问JVM调优

欢迎关注头条号:java小马哥周一至周日下午三点半!精品技术文章准时送上!!!精品学习资料获取通道,参见文末JVM 调优概述性能定义吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。内存占用 - 垃圾收集器流畅运行所需要的内存数量。调优原则G...

weixin_36391993的博客 102

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java架构师面试题——JVM性能调优

JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会...

zhan_lang的博客 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

面试BAT时,他们问了我这些!

能进入BAT 等一线大厂工作,是很多开发者们的目标与梦想,为帮助开发者们提升面试技能、高效通关一线互联网公司的面试,提炼总结了这份面试真题,一次整体放出送给大家。 看看自己能答对多少 本篇建议大家收藏、备用~ 【BAT 等一线互联网面试真题集锦】 涵盖:开源、Java集合、JVM、NIO、Dubbo、秒杀系统、高并发、分布式、锁、redis、MySQL、Linux、hashMap、中间件等...

JavaEdge全是干货的技术号 6850

大厂面试官为什么老是喜欢问JVM?

前言 最近有粉丝在后台跟我抱怨,自己去大厂面试,面试官老是喜欢问JVM! 你问JVM干啥?程序员平时又用不到这些东西!多问问框架、数据库、项目经验不行么? 有些人觉得是面试官zb,就爱问这种虚而不实的东西,显得自己牛逼,公司牛逼! 其实这种想法非常幼稚!我不排除部分面试官有这种想法,喜欢面试虐人。但是大厂有大厂的考虑,问JVM主要是看你在技术方向的潜力,你看对待技术有没有深挖的态度。 大概在201...

玩赚AI大模型的博客 1181

面了BAT,我总结了他们会问的JVM基础知识

没想到他会这么问

Craig无忌 2616

【BAT面试宝典】JVM GC基础和GC 调优

JVM GC基础和GC 调优 GC的基础知识 1.什么是垃圾 各语言内存申请与回收概括: C:malloc free C++: new delete Java: new ? 自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出两种类型的问题: 忘记回收 多次回收 总结:Java中没有任何引用指向的一个对象或者多个对象(循环引用)就称为垃圾。 2.如何找到垃圾 引用计数(reference count),不能解决循环引用定位问题; 根可达算法(Root Searching) 3.常见的垃

讯开技术孵化器博客 428

BAT面试必问的23道JVM面试题解析,我猜你最多能回答3道!

本文转载自:BAT面试必问的23道JVM面试题解析,我猜你最多能回答3道! 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能...

Java_supermanNO1的博客 309

JVM性能调优~JVM内存整理及GC回收

JVM作为Java语言的基础,虽然平时工作中真正运用到的时候可能并不多,一个程序员想要上升到高级层次,那就必须知道Java到底是怎么运行的,这就逃不开JVM。想要告别增删改查和简单开发,而是去做Java性能分析和调优工作,那么,Java虚拟机绝对是一把助力的利剑。 学习Java虚拟机的原因,本质是让你了解Java程序是如何被执行且优化的。这样一来,你才可以从内部入手,达到高效编程的目的。同时,你也可以为学习更深层、更核心的Java技术打好基础。且对于面试BAT等一线互联网大厂时JVM是必问常问的高频点之一

m0_67788957的博客 830

BAT面试专题:深入理解JVM——图解JVM调优

**JVM: **java虚拟机,java的核心与基础,用来运行java的程序1、java程序的运行过程java源文件被编译器编译成.class文件class文件被类加载器加载至内存//--------类加载器:将.class文件加载至内存并且生成相应的class对象执行2、JVM程序执行的顺序加载.class文件>>>>管理分配内存>>>>执行垃圾收集java语言的特点就是平台的无关性:java虚拟机在执行字节码时,把字节码解释成具体平台的机器指令,这也就是java能够“一次编译,到处运行”的原因JVM调

mt77666的博客 280
上一篇: 分享30道Redis面试题,面试官能问到的我都找到了
下一篇: 985Java程序员的三次面试总结,京东,华为,去哪儿 , 已拿offer
刀哥谈Java
博客等级 码龄8年 110粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值