阿里面试官问我:Java从编译到执行,发生了什么?

for循环陷阱——阿里面试官:为什么Java开发手册强制不要在 foreach 里进行元素删除? 文章通过小二面试阿里时遇到的"为什么不能在foreach循环中删除元素"问题,深入分析了Java集合的fail-fast机制。作者指出foreach本质是迭代器实现,迭代器会检查modCount和expectedModCount是否一致,若不一致则抛出ConcurrentModificationException。正确删除元素应使用迭代器的remove()方法,该方法会同步这两个计数值。此外,文章还介绍了break终止循环、普通for循环和Stream过滤等替代方案,但指出迭代器方式是最 阅读详情

面试官:今天从基础先问起吧,你是怎么理解Java是一门「跨平台」的语言,也就是「一次编译,到处运行的」?

候选者:很好理解啊,因为我们有JVM。

候选者:Java源代码会被编译为class文件,class文件是运行在JVM之上的。

候选者:当我们日常开发安装JDK的时候,可以发现JDK是分「不同的操作系统」,JDK里是包含JVM的,所以Java依赖着JVM实现了『跨平台』

候选者:JVM是面向操作系统的,它负责把Class字节码解释成系统所能识别的指令并执行,同时也负责程序运行时内存的管理。

面试官:那要不你来聊聊从源码文件(.java)到代码执行的过程呗?

候选者:嗯,没问题的

候选者:简单总结的话,我认为就4个步骤:编译->加载->解释->执行

候选者:编译:将源码文件编译成JVM可以解释的class文件。

候选者:编译过程会对源代码程序做 「语法分析」「语义分析」「注解处理」等等处理,最后才生成字节码文件。

候选者:比如对泛型的擦除和我们经常用的Lombok就是在编译阶段干的。

候选者:加载:将编译后的class文件加载到JVM中。

候选者:在加载阶段又可以细化几个步骤:装载->连接->初始化

候选者:下面我对这些步骤又细说下哈。

候选者:【装载时机】为了节省内存的开销,并不会一次性把所有的类都装载至JVM,而是等到「有需要」的时候才进行装载(比如new和反射等等)

候选者:【装载发生】class文件是通过「类加载器」装载到jvm中的,为了防止内存中出现多份同样的字节码,使用了双亲委派机制(它不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上)

候选者:【装载规则】JDK 中的本地方法类一般由根加载器(Bootstrp loader)装载,JDK 中内部实现的扩展类一般由扩展加载器(ExtClassLoader )实现装载,而程序中的类文件则由系统加载器(AppClassLoader )实现装载。

候选者:装载这个阶段它做的事情可以总结为:查找并加载类的二进制数据,在JVM「堆」中创建一个java.lang.Class类的对象,并将类相关的信息存储在JVM「方法区」中

面试官:嗯…

候选者:通过「装载」这个步骤后,现在已经把class文件装载到JVM中了,并创建出对应的Class对象以及类信息存储至方法区了。

候选者:「连接」这个阶段它做的事情可以总结为:对class的信息进行验证、为「类变量」分配内存空间并对其赋默认值。

候选者:连接又可以细化为几个步骤:验证->准备->解析

候选者:1. 验证:验证类是否符合 Java 规范和 JVM 规范

候选者:2. 准备:为类的静态变量分配内存,初始化为系统的初始值

候选者:3. 解析:将符号引用转为直接引用的过程

面试官:嗯…

候选者:通过「连接」这个步骤后,现在已经对class信息做校验并分配了内存空间和默认值了。

候选者:接下来就是「初始化」阶段了,这个阶段可以总结为:为类的静态变量赋予正确的初始值。

候选者:过程大概就是收集class的静态变量、静态代码块、静态方法至()方法,随后从上往下开始执行。

候选者:如果「实例化对象」则会调用方法对实例变量进行初始化,并执行对应的构造方法内的代码。

候选者:扯了这么多,现在其实才完成至(编译->加载->解释->执行)中的加载阶段,下面就来说下【解释阶段】做了什么

候选者:初始化完成之后,当我们尝试执行一个类的方法时,会找到对应方法的字节码的信息,然后解释器会把字节码信息解释成系统能识别的指令码。

候选者:「解释」这个阶段它做的事情可以总结为:把字节码转换为操作系统识别的指令

候选者:在解释阶段会有两种方式把字节码信息解释成机器指令码,一个是字节码解释器、一个是即时编译器(JIT)。

候选者:JVM会对「热点代码」做编译,非热点代码直接进行解释。当JVM发现某个方法或代码块的运行特别频繁的时候,就有可能把这部分代码认定为「热点代码」

候选者:使用「热点探测」来检测是否为热点代码。「热点探测」一般有两种方式,计数器和抽样。HotSpot使用的是「计数器」的方式进行探测,为每个方法准备了两类计数器:方法调用计数器和回边计数器

候选者:这两个计数器都有一个确定的阈值,当计数器超过阈值溢出了,就会触发JIT编译。

候选者:即时编译器把热点方法的指令码保存起来,下次执行的时候就无需重复的进行解释,直接执行缓存的机器语言

面试官:嗯…

候选者:解释阶段结束后,最后就到了执行阶段。

候选者:「执行」这个阶段它做的事情可以总结为:操作系统把解释器解析出来的指令码,调用系统的硬件执行最终的程序指令。

候选者:上面就是我对从源码文件(.java)到代码执行的过程的理解了。

面试官:嗯…我还想问下你刚才提到的双亲委派模型…

候选者:下次一定!

本文总结:

  • Java跨平台因为有JVM屏蔽了底层操作系统

  • Java源码到执行的过程,从JVM的角度看可以总结为四个步骤:编译->加载->解释->执行

    • 「编译」经过 语法分析、语义分析、注解处理 最后才生成会class文件
    • 「加载」又可以细分步骤为:装载->连接->初始化。装载则把class文件装载至JVM,连接则校验class信息、分配内存空间及赋默认值,初始化则为变量赋值为正确的初始值。连接里又可以细化为:验证、准备、解析
    • 「解释」则是把字节码转换成操作系统可识别的执行指令,在JVM中会有字节码解释器和即时编译器。在解释时会对代码进行分析,查看是否为「热点代码」,如果为「热点代码」则触发JIT编译,下次执行时就无需重复进行解释,提高解释速度
    • 「执行」调用系统的硬件执行最终的程序指令

【对线面试官-移动端】系列 一周两篇持续更新中!

【对线面试官-电脑端】系列 一周两篇持续更新中!

原创不易!!求三连!!

阿里面试1234面详细完整流程——JAVA岗位 NIO本身是基于事件驱动的思想来实现的,其目的就是解决BIO的大并发问题,在BIO模型中,如果需要并发处理多个I/O请求,那就需要多线程来支持,NIO使用了多路复用器机制,以socket使用来说,多路复用器通过不断轮询各个连接的状态,只有在socket有流可读或者可写时,应用程序才需要去处理它,在线程的使用上,就不需要一个连接就必须使用一个处理线程了,而是只是有效请求时(确实需要进行I/O处理时),才会使用一个线程去处理,这样就避免了BIO模型下大量线程处于阻塞等待状态的情景。例如,在一个聊天服务器中。 阅读详情

相关推荐

为什么阿里巴巴强制不要在 foreach 里执行删除操作

那天,小二去阿里面试,面试官老王一上来就甩给了他一道面试题:为什么阿里的 Java 开发手册里会强制不要在 foreach 里进行元素的删除操作?小二听完就面露喜色,因为两年前,也就是 2021 年,他在《Java 程序员进阶之路》专栏上的第 63 篇看到过这题????。 PS:star 这种事,只能求,不求没效果,铁子们,《Java 程序员进阶之路》在 GitHub 上已经收获了 523 枚星标,小伙伴们赶紧去点点了,冲 600 star! https://github.com/itwanger/toB

沉默王二 1万+

还不明白Java从编译到执行的过程?看这一篇

文章目录前言一、跨平台二、编译三、加载四、解释五、执行总结 前言 之前我们都只是编写运行java程序,很少了解java程序从编译到执行到底经历了什么。从编译到执行大致可以分为四个阶段:编译->加载->解释->执行,本文介绍了这几个阶段主要发生的事情以及作用。 一、跨平台 Java程序是由JAVA虚拟机负责解释执行的,而非操作系统.实现java程序的跨平台运行,运行相同的java程序只需要安装不同版本的java虚拟机即可. 不同的操作系统使用不同版本的java虚拟机.这种方式使得jav

qq_52173163的博客 2364

SAP COPA实战:手把手教你用CMOD增强搞定自定义特性派生(以客户字段为例)

本文详细介绍了在SAP COPA模块中通过CMOD增强实现自定义特性派生的全流程,以客户字段为例,展示了从特性设计、SPRO配置到特性派生逻辑实现的完整步骤。重点讲解了如何利用CMOD增强技术解决业务需求,提升获利能力段分析的灵活性和准确性。

weixin_30275415的博客 428

Java 从源码文件(.java)到代码执行过程发生了什么?

我们都知道 Java 是一门一次编译到处运行的语言,这与 JVM 有很大的关系,当我们执行 Java 程序的时候,会把一个一个的 .java 文件转化成 JVM 可以理解的 class 文件,然后又 JVM 去执行,注意这里的 JVM 是分操作系统的,所以可以做到一次编译,到处运行。那么Java 从源码文件(.java)到代码执行过程发生了什么?简单总结就是四个步骤:编译 --> 加载 --> 解释 --> 执行。...

栗子的博客 425

深入浅出:.sh文件在Linux系统中的实战应用与技巧

本文深入浅出地介绍了.sh文件在Linux系统中的实战应用与技巧。从基础概念入手,详细讲解了Bash脚本的运行方法、权限管理,并通过编写自动化备份脚本等实例,展示了如何利用Shell脚本提升工作效率。文章还涵盖了脚本调试、错误处理以及函数、参数解析等进阶技巧,帮助读者从入门到精通,掌握这一强大的自动化工具。

weixin_29243279的博客 346

COT Buck和普通Buck的区别

传统的电流模控制的调制原理,由时钟脉冲信号 clk 的上升沿触发开始一个新的开关周期,d 由低变高,主开关闭合,流过它的电流和电感电流相等,并以固定斜率逐渐增大,直至 iL *Ri 与斜坡补偿信号 se 的和等于控制信号 vc;此时,比较器的输出电平由低变高,导通时间产生器被触发,其输出 d 由低变高,并产生一个固定的导通时间 Ton;然后 PWM 比较器的输出由低变高,导通时间产生器被触发,主开关闭合,电感电流逐渐增大,直到导通时间产生器计满固定的时间 Ton,d 变为低电平,主开关断开,周期结束。

模拟芯片设计 1126

教妹学Java(五):Java程序在编译和运行时发生了什么

大家好,我是沉默王二。本篇文章通过我和三妹的对话来谈一谈“Java程序在编译和运行时发生了什么”。 没见过这么有趣的标题吧?“语不惊人死不休”,没错,本篇文章的标题就是这么酷炫,接受不了的同学就别点进来看了,所谓好奇心害死猫;能够接受的同学我只能说你赚到了,你不仅能在阅读的过程中感受到思维的乐趣,还真的能学习到知识。下面就由我来介绍一下故事的背景吧。 我有一个漂亮如花的妹妹(见上图),她叫什么呢...

沉默王二 7917

Zephyr RTOS 嵌入式 C 编程 (使用嵌入式 RTOS POSIX API)8. Zephyr RTOS 与以太网、Wi-Fi 及 TCP/IP

支持的 BSD 函数包括:socket()、close()、recv()、recvfrom()、send()、sendto()、connect()、bind()、listen()、accept()、fcntl()(用于设置非阻塞模式)、getsockopt()、setsockopt()、poll()、select()、getaddrinfo()和 getnameinfo()。向开发板烧录代码也可能存在问题。可以通过调用 net_if_up() 开启网络接口 ,调用 net_if_down() 关闭接口。

1342

java类从编译到运行

1.一个简单的java类是怎么运行的呢? 先让我们了解一下java语言的特性,如果编程语言分为,机械语言、汇编语言、高级语言,java可以被称作为一种高级语言,java是运行在jvm上的,jvm又是由c实现的,c最后难免翻译成汇编语言最后翻译为机械语言,我们这里知识有限只探究到jvm这层。 让我开始吧,先从一段简单的java的代码开始 public class TestJavaRun{ ...

u014732336的博客 309

Mac和VScode配置fortran

macOS系统 vscode fortran gfortran 终端

weixin_43047707的博客 2409

基于matlab实现的水果识别系统设计

本项目针对多种常见水果混合的图像,利用 Matlab 软件,对水果的识别进行研究。根据水果和背景的差别选取阈值,对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测,选定连通区域,标记后再对不同种水果的颜色,形状,大小等特征进行快速识别水果,从而实现对水果的正确分拣。:水果识别、MATLAB、数字图像处理。

热情、奔放、快乐编程! 4851

阿里面试官:我就问了一下JVM,没想到他能跟我吹半个小时

前言: 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识。 JVM知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准。 在这里我们将详细的整理常见的 JVM 面试题目,并给出标准答案,提供给大家学习参考。等大家面试的时候,希望能对面试官吹个半个小时,如果真是这样,我想说:牛皮啊! 另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,下方只是部分截图 想要资料的话也可以点击795983544领取 暗号优快云。 1、

qq_50524970的博客 3740

渗透测试面试题

渗透测试面试题 一.思路流程 1.信息收集 服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等) 网站指纹识别(包括,cms,cdn,证书等),dns记录 whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等) 子域名收集,旁站,C段等 google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等 扫描网站目录结构,爆后台,网站banner,测试文件,...

千寻的博客 12万+

阿里面试官:你要是掌握java代码到这个程度,我要你!

看完猿进化系列文章,相信你已经具备比较熟练的进行简单的web开发的能力了,不过还不够,要想快速的成长为一个合格的猿人,必须先学会猿人的思考方式。真的很感谢大家的支持,和巨兽的斗争仍然在进行,关于为什么我还在写文章,我想说,能写点儿是点儿,也许是最后一课,猿人工厂君已经说了,虽千万人,吾往矣。程序员更多的时候还是需要正义,坚持,勇敢和不退缩。如果觉得文章还凑活,也希望你关注和转发本文,好文章大家分享...

hzldds2019的博客 1024

TMC2240 芯片数据手册解读|第三篇 TMC2240 芯片引脚配置与说明

本文详细解析了TMC2240芯片的两款封装(TQFN32和TSSOP38-EP)的引脚分布、电气属性及硬件设计要点。内容涵盖:1)芯片内部功能架构,包括供电、运动控制等五大链路;2)两款封装的核心规范与适用场景;3)七大引脚分类详解(电源、控制、编码器等)及接线要求;4)PCB设计避坑指南,强调电源分割、电荷泵布局等关键点。文章提供完整的原理图绘制和硬件调试指导,适合不同基础的工程师参考实践。

BackCatK Chen的博客 1090

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

阿里面试都问什么?万字总结(2)

阿里二面 等了将近6天(还以为被刷了呢)终于在第二周的周四接到阿里面试电话,那叫一个激动啊。 赶紧找了一个安静的地方,准备好后开始正式面试。二面的面试官是一个部门主管,自然还是有点小紧张的。这次面试官上来就直接问,没有一面的面试官那么好说话。 下面是面试过程中的问题: 自我介绍下自己,不超过3分钟(我的自我介绍仍然不超过1分钟) 你说你熟悉并发编程,那么你说说Java锁有哪些种类,以及区别(果然深...

Xn346的博客 1913

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

阿里面试 Java 都问什么?万字总结!

作者:rhwayfunnblog.youkuaiyun.com/u011116672/article/details/50991618拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR...

Java技术栈,分享最主流的Java技术 925

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

去年去阿里面试,面试官居然问我Java类和对象,我是这样回答的!

1.谈谈你对Java面向对象的理解?   面向对象就是把构成问题的事务分解成一个个对象,建立对象的目的不是一个步骤,而是为了描述一个事务在解决问题中的行为。类是面向对象的一个重要概念,类是很多个具有相同属性和行为特征的对象抽象出来的,对象是类的一个实例。 类具有三个属性:继承、封装和多态。 封装:通过把程序模块化、对象化,通过把这些具体事物的特性属性和通过这些属性实现的具体方法放到一个类中。核心思想就是“隐藏细节”,“数据安全”。利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成

weixin_47067712的博客 1650

androID系统开发,阿里面试官必问

1、ViewGroup 绘制顺序 (例:自定义 ViewGroup 如何实现 FlowLayout?如何实现 FlowLayout 调换顺序)2、 自定义 View 如何实现打桌球效果;3、 自定义 View 如何实现拉弓效果,贝瑟尔曲线原理实现?2.

2401_83641443的博客 870

Java最全Java字节码调试与反编译_java 反编译 调试,让阿里面试官都赞同不已的Spring解读

这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)

2401_84690353的博客 1004

阿里面试官问Java中init和clinit区别,这么回答offer应该稳了

JVM 源码,都是初始化方法 1 执行时机 init是构造器时 clinit是类构造器时,也就是在类加载—–验证—-解析—–初始化,中的初始化阶段jvm调用clinit方法 2 执行目的 看 JVM 源码: is_static是啥? init是instance实例构造器,对非静态变量解析初始化 clinit是class类构造器对静态变量,静态代码块进行初始化 3 clinit详解 准备阶段,变量已经赋过一次系统要求的初始值 在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源

JavaEdge全是干货的技术号 2332

阿里面试官必问:Java为什么能跨平台?90%初学者只懂一半原理!

中间字节码 + 平台专属 JVM代码层面跨平台,虚拟机层面适配平台和 C/C++ 的核心区别:是否生成系统无关的中间字节码这道题是 Java 面试的入门基石,吃透原理,后续 JVM、类加载、程序执行原理都能一通百通!

程序员夏洛的博客 421
上一篇: 我说不会Java内存模型,阿里把我挂了。
下一篇: 阿里面试官:双亲委派都不懂就来面Java?
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值