[八股速成]JVM篇

前言

我之前整理过JVM超详细八股笔记:https://www.nowcoder.com/discuss/593844277646471168?sourceSSR=search,但是说实话因为这份这份八股资料过于详细,内容过于充实,给背记带来了很大的挑战,所以我准备再出一系列帖子,内容就是我根据自己的面试经历和网上的面经,去筛选八股里面哪些是最常被问到的问题把它们整理出来,这样也能省去大家自己整理和筛选的时间大家可以在面试前一两个小时快速把这一系列最常问八股的帖子拿出来看看,临时抱佛脚的效果应该很好。后面这系列帖子我会放入专栏https://www.nowcoder.com/creation/manager/columnDetail/0ybvLm,欢迎大家订阅。最后我想说,速成虽好,但是还是建议有时间就去看看我详细的八股笔记帖子。

想要学习Java冲实习或冲春招的,我能助你一臂之力,我之前整理了高质量可速成的魔改外卖项目话术和7000字轮子项目话术,还有超全超精品八股大全专栏怎么写简历怎么包装实习经历,怎么0基础速成冲春招和实习等等等等精品帖子,大家可以去看看我的精品文章汇总帖子:https://www.nowcoder.com/discuss/721704696242536448?sourceSSR=users

我的八股大全专栏(15w人学习,超千人订阅,牛客最受欢迎最高质量java八股专栏,多一句没有,少一句不行)https://www.nowcoder.com/creation/manager/columnDetail/j8ZZk0

1.常问问题

1.new一个对象到销毁的过程/java对象创建过程?

在Java中,从创建(new)一个对象到销毁的过程大致可以分为以下几个步骤:

  • 检查类是否加载:对象的实际创建是通过new关键字实现的。当JVM遇到new关键字时,会检查类是否已经加载到运行时数据区的方法区,如果没有,则先进行类的加载和初始化。
  • 分配内存空间:当使用new关键字创建一个对象时,JVM会在运行时数据区的堆中为该对象分配相应的内存空间。
  • 初始化对象:JVM会调用相应的构造方法来初始化对象,给对象的成员变量赋予初始值。
  • 使用对象:在程序运行过程中,可以通过对象引用来访问和操作对象的成员变量和方法。
  • 对象不再被引用:当对象不再被任何变量或数据结构引用时,它就成为垃圾对象,等待垃圾回收器进行回收。
  • 垃圾回收:JVM的垃圾回收器会定期检查堆内存中的垃圾对象,并自动回收它们所占用的内存空间。垃圾回收的具体时机和策略取决于JVM的垃圾回收算法。
  • 内存空间释放:当垃圾对象被回收后,它们占用的内存空间会被释放,以便重新分配给新创建的对象。

需要注意的是,JVM的垃圾回收机制会自动处理对象的销毁和内存空间的释放,程序员无需手动进行这些操作。但是,为了提高程序性能和避免内存泄漏,程序员应该养成良好的编程习惯,及时释放不再使用的对象引用。

2.java程序运行流程是什么?(编译+运行)

运行流程:

(-1) 编写java代码,文件后缀名为.java

(0)通过java编译器(如javac)将java源代码编译成.class字节码文件

(1)类加载器(ClassLoader)将 class 字节码文件加载到内存中(运行时数据区),但是字节码文件是JVM定义的一套指令集规范,并不能直接交给底层操作系统去执行

(2)特定的命令解释器(执行引擎)将class字节码翻译成特定的操作系统指令集交给 CPU 去执行

(3)此时可能需要调用其他语言的本地库接口(Native Method Library)来实现整个程序的功能

3.类加载执行过程

Class 字节码文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢?

类加载的全过程,即加载、验证、准备、解析和初始化这五个阶段。

  • 加载:查找和导入Class字节码文件通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
  • 验证:保证加载类的准确性这一阶段的目的是确保Class文件的字节流包含的信息符合《Java虚拟机规范》的所有约束要求,从而保证这些信息被当作代码运行后不会危害虚拟机自身的安全。
  • 准备:为类变量(即静态变量)分配内存并设置类变量初始值需要注意的是,这时候进行内存分配的仅包括类变量,而不包括实例变量
  • 解析:把类中的符号引用转换为直接引用解析阶段主要是将常量池内的符号引用转换为直接引用。如果符号引用指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载。符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式 的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目 标并不一定是已经加载到虚拟机内存当中的内容。各种虚拟机实现的内存布局可以各不相同,但是它们 能接受的符号引用必须都是一致的,因为符号引用的字面量形式明确定义在《Java虚拟机规范》的Class 文件格式中。直接引用(Direct References):直接引用是可以直接指向目标的指针、相对偏移量或者是一个能间接 定位到目标的句柄。直接引用是和虚拟机实现的内存布局直接相关的,同一个符号引用在不同虚拟机实 例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在虚拟机的内存中 存在。
  • 初始化:执行类的构造器方法初始化阶段是执行类的构造器方法的过程。这个方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并而来的。若该类具有父类,JVM会保证父类的先执行,然后才执行子类的。

4.说下java的编译和运行2阶段

在编译阶段中,Java源代码通过前端编译器转换成字节码文件,即.class文件。而在运行阶段,这些字节码文件会被Java虚拟机(JVM)加载并执行。

编译时类型和运行时类型

  • 编译时类型(Compile-time Type)

编译时类型是指在编译阶段确定的对象类型。这是由代码中的声明决定的,例如变量声明、方法参数或返回类型的声明。编译器使用这些类型来执行类型检查,确保代码符合Java语言的语法规则和类型系统规则。如果代码违反了这些规则,编译器将生成错误,并且程序无法编译成功。

  • 运行时类型(Run-time Type)

运行时类型是指对象在程序实际执行时的实际类型。在运行时,对象的真实类型可能与编译时类型不同,尤其是在使用继承和多态的情况下。例如,如果你有一个父类类型的引用指向一个子类实例,那么该引用的编译时类型是父类,但其运行时类型是子类。

Animal animal = new Dog(); // 或者 new Cat()

在这个例子中:

  • animal编译时类型Animal,因为这就是它在代码中被声明的类型。
  • animal运行时类型可能是 Dog 或者 Cat,具体取决于创建时传入的是哪个子类的实例。

2.JVM组成

1.JVM是什么(实现java跨平台)

JVM(Java虚拟机)是Java跨平台的关键。在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行,也就是说,只要在不同的平台上安装对应的JVM,就可以运行字节码文件。同一份Java源代码在不同的平台上运行,它不需要做任何的改变,并且只需要编译一次。而编译好的字节码,是通过JVM这个中间的“桥梁”实现跨平台的,JVM是与平台相关的软件,它能将统一的字节码翻译成该平台的机器码

好处:

  • 一次编写,到处运行
  • 自动内存管理,垃圾回收机制

JVM怎么实现一次编写,到处运行?

JVM(Java虚拟机)通过实现一次编写,到处运行的机制,使得Java程序可以在不同平台上运行。具体实现方式如下:

  1. Java源代码:首先,将Java源代码编译成字节码文件(.class文件)。字节码是一种中间代码,介于源代码和机器码之间,具有平台无关性。
  2. 字节码文件:字节码文件可以在任何安装了JVM的平台上运行。JVM负责将字节码文件解释执行或者即时编译成本地机器码。
  3. JVM:JVM是Java程序的运行环境,它负责加载字节码文件、解释执行字节码或者将字节码即时编译成本地机器码。不同的操作系统和硬件平台上有不同的JVM实现,如Windows、Linux、macOS等。
  4. 跨平台支持:由于JVM的存在,Java程序可以在不同的操作系统和硬件平台上运行,实现了一次编写,到处运行的目标。

2.JVM由哪些部分组成

  • ClassLoader(类加载器):负责加载字节码文件(即 class 文件)到运行时数据区,class 文件在文件开头有特定的文件标示,并且ClassLoader 只负责class 文件的加载,至于它是否可以运行,则由 Execution Engine 决定。
  • Runtime Data Area(运行时数据区,即java内存):是存放java内存相关数据的,分为五部分:Stack(虚拟机栈),Heap(堆),MethodArea(方法区),PC Register(程序计数器),Native Method Stack(本地方法栈)。几乎所有的关于 Java 内存方面的问题,都是集中在这块。
  • Execution Engine(执行引擎):Class 文件被加载后,会把指令和数据信息放入内存中,Execution Engine 则负责把这些命令解释给操作系统,即将 JVM 指令集翻译为操作系统指令集。
  • Native Method Library(本地库接口):负责调用本地接口的。他的作用是调用不同语言的本地接口给 JAVA 用

3.运行时数据区(JVM内存)

1.运行时数据区包含了哪几个部分?

运行时数据区包含了堆、方法区、虚拟机栈、本地方法栈、程序计数器这几部分,每个功能作用不一样

  • 堆:Java堆是线程共享的区域,主要用于存储new出来的对象实例(包括Class对象:每个类在加载到JVM的方法区时都会产生一个相应的Class对象)。在这里分配对象实例的内存空间,它是垃圾收集器管理的主要区域,通过-Xmx和-Xms参数可以调整堆的大小。堆内存的合理分配和释放对于Java程序的性能至关重要。堆是Java虚拟机所管理的内存中最大的一块,用于存放所有类实例和数组对象。Java堆可以细分为新生代(Young Generation)和老年代(Old Generation),其中新生代又可以进一步细分为Eden空间和两个Survivor空间(S0, S1)。空间大小比eden:survivor

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏价格永远为19.9元! 不想当架构师的后端开发工程师不是好码农! 此专栏一方面用于存放我的架构设计学习笔记, 另外我会在本专栏加入一系列最常问八股问题帖子,内容就是我根据自己的面试经历和网上的面经,去筛选八股里面哪些是最常被问到的问题把它们整理出来,大家可以在面试前一两个小时快速把这一系列最常问八股的帖子拿出来看看,临时抱佛脚的效果应该很好

全部评论
感谢大佬,我们的八股有救了
4 回复 分享
发布于 2025-03-12 11:28 北京
mark
点赞 回复 分享
发布于 2025-04-20 11:08 浙江
收藏了感谢大佬
点赞 回复 分享
发布于 2025-04-07 21:22 安徽
收藏!
点赞 回复 分享
发布于 2025-03-15 22:17 北京
点赞 回复 分享
发布于 2025-03-13 15:58 天津
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-12 17:18 陕西
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-12 16:17 江西
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-12 09:25 福建
mark
点赞 回复 分享
发布于 2025-03-11 17:19 湖南
太强了
点赞 回复 分享
发布于 2025-03-11 17:12 吉林
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-11 17:03 北京
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-11 16:45 北京
大佬的经验真是宝贵财富,让我在工作中更加得心应手,感谢你的分享!
点赞 回复 分享
发布于 2025-03-11 16:20 北京
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-11 16:12 北京
大佬的分享让我少走了很多弯路,真是实用又贴心的经验,感激不尽!
点赞 回复 分享
发布于 2025-03-11 16:04 北京
大佬分享的经验真是太宝贵了,让我受益匪浅,真心感谢大佬的无私分享!
点赞 回复 分享
发布于 2025-03-11 15:56 北京
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-11 15:20 陕西省
mark一下常问问题
点赞 回复 分享
发布于 2025-03-11 12:23 甘肃
mark
点赞 回复 分享
发布于 2025-03-10 23:12 黑龙江
收藏了感谢大佬
点赞 回复 分享
发布于 2025-03-10 17:20 北京

相关推荐

最近闲来无事,复盘一下历史的面试总结,希望可以为后面求职的兄弟姐妹有一定参考。本人川大垃圾专业,主要方向国央企,希望面试经验可以帮到大家。1. 自我介绍答题思路:结构: 个人基本信息(学校专业)+ 核心竞争力(成绩/实习/技能)+ 求职动机(为什么选国网青海)。关键点: 简洁明了,控制在1-2分钟。既然是应届生,重点突出学习能力和在校期间的实践经历。回答示例:各位面试官好,我是xx大学xx专业的26届毕业生。在校期间,我不仅保持了专业前xx%的成绩,还系统掌握了电力系统相关的理论知识。此外,我曾担任学生会xx职务/在xx单位实习过,这段经历锻炼了我的沟通协调能力和解决实际问题的能力。我性格沉稳踏实,一直非常向往国家电网的工作平台。青海公司有着广阔的发展空间,我希望能用我的专业知识在这里扎根,为公司的发展贡献一份力量。2. 你怎么理解国家电网“以客户为中心”的思想?答题思路:定义: 不仅仅是服务态度好,更是保障供电质量、响应社会需求。结合青海: 青海地广人稀,服务难度大,“以客户为中心”意味着更艰苦的付出和保障民生。落脚点: 这与作为垄断型央企的社会责任是一致的。回答示例:我认为国家电网的‘以客户为中心’,核心在于‘人民电业为人民’的企业宗旨。首先,对于普通用户,这意味着不仅要态度热情,更要保障供电的安全和稳定,毕竟电是现代生活的基石。其次,对于企业客户,这意味着提供高效的办电流程和可靠的能源支持,助力地方经济发展。特别是针对青海地区,地理环境复杂,用户居住分散,‘以客户为中心’更意味着我们要克服环境困难,在恶劣天气下也能快速响应故障抢修,把优质服务送到最后一公里,真正做到让政府放心、让客户满意。3. 你的人生价值观是什么?答题思路:关键词: 责任、踏实、奉献、持续学习。逻辑: 价值观必须与国网的氛围(稳定、责任、大国重器)相契合。回答示例:我的人生价值观可以概括为八个字:脚踏实地,承担责任。作为一名应届生,我认为‘脚踏实地’是成长的基石,不眼高手低,愿意从基层做起,在工作中积累经验。同时,我非常看重‘责任感’。无论是在学校还是未来的工作中,答应的事情就要尽力做好,遇到困难不推诿。国家电网关系着国计民生,在这里工作更需要这种严谨负责的态度。我希望通过个人的努力,在实现自我价值的同时,也能为社会创造实实在在的价值。4. 谈一下你的职业规划答题思路:原则: 稳定性第一。面试官最怕应届生干两天就跑。阶段: 试用期/前1-2年(学习适应)-> 3-5年(骨干力量)-> 长期(深耕专业)。回答示例:我的职业规划非常清晰,就是希望能深耕电力行业,成为一名技术过硬的电力人。第一阶段(入职1-2年): 这是我的‘海绵期’。我会虚心向师傅和同事请教,熟悉公司的业务流程和规章制度,熟练掌握岗位所需的各项技能,尽快完成从学生到职场人的转变。第二阶段(3-5年): 成为部门的业务骨干。在能独立胜任工作的基础上,主动承担更多责任,考取相关的职业资格证书,提升专业深度。第三阶段(长期): 结合公司需要和个人特长,争取在技术或管理领域承担更重要的角色,为国家电网青海公司的发展长期服务。5. 如果你与你的上司发生矛盾,你会如何处理?答题思路:态度: 对事不对人,服从指挥,注重沟通。忌讳: 绝对不要说“据理力争”“顶撞领导”或者“忍气吞声”。回答示例:首先,我会保持冷静和尊重。领导通常拥有更丰富的工作经验和全局视野,我们的分歧往往是因为看待问题的角度不同。如果矛盾发生在工作中,我会先私下找机会与领导沟通,委婉地表达我的想法,同时仔细聆听领导的意图。如果最终领导坚持他的方案,我会坚决执行,因为经验告诉我,团队的整体行动力比个人观点的对错更重要。事后,我会反思自己的沟通方式,并在工作中通过结果来证明自己的价值。我相信良好的工作关系是建立在相互信任和完成任务的基础上的。6. 如果把你分配到偏远地区,你怎么选择?答题思路:得分点: 这是针对青海面试的必考题。必须表态愿意去,并且展示出吃苦的准备。策略: 承认困难 + 表达决心 + 把困难转化为机遇(锻炼机会)。回答示例:我愿意服从公司的分配。作为一名应届生,我深知基层经验是最宝贵的财富。虽然偏远地区条件可能艰苦一点,但这正是磨练意志、提升业务能力的最佳场所。国家电网的很多输变电设施都分布在人烟稀少的地方,这些地方更需要电力人去守护。如果能被分配到偏远地区,我会把它当成是对我的考验,积极调整心态,克服生活上的不便,安心工作。而且,基层一线往往能接触到最实际的技术问题,这对我未来的职业成长其实是大有裨益的。7. 你对国家电网经营理念中的“国家特色”怎么理解?答题思路:核心: “顶梁柱”作用,政治意识,服务国家战略(如西电东送、双碳目标)。结合: 不仅要讲经济效益,更要讲政治责任和社会责任。回答示例:我认为国家电网的‘国家特色’,主要体现在它不仅仅是一个追求利润的企业,更是服务国家战略的‘顶梁柱’。具体来说,有三个方面:第一是政治站位。始终坚持党的领导,在关键时刻(如抗震救灾、重大保电)拉得出、顶得上。第二是服务大局。比如推进‘双碳’目标,建设新型电力系统,以及青海特有的清洁能源外送,这都是为了国家整体的能源安全和绿色发展,而不是单纯的商业利益。第三是人民情怀。通过村村通工程、农网改造等,体现了央企对共同富裕和民生保障的担当。这种‘国家特色’正是国家电网最让人尊敬的地方,也是我渴望加入的原因。8. 如果领导出差了,交给你一项任务,出现重大错误,同事们对你议论纷纷,你怎么办?答题思路:行动: 补救错误 > 汇报沟通 > 承担责任 > 总结教训。心态: 面对议论,不解释、不辩解,用结果说话。回答示例:面对这种情况,我会先解决心情,再解决事情,保持冷静是处理危机的前提。第一,全力补救。 我会第一时间评估错误的后果,尽我所能去止损,或者寻找解决方案,将损失降到最低。第二,及时汇报。 补救的同时,我会主动联系出差中的领导,如实汇报情况,说明我的补救措施,绝不隐瞒,让领导掌握真实情况。第三,承担责任,反思总结。 错误既然发生了,我会坦然承担责任。对于同事的议论,我不会去争辩或抱怨,因为此时最好的回应是改正错误并做好后续工作。第四,事后复盘。 任务结束后,我会深刻反思原因,是因为流程不熟悉还是沟通不到位,确保同样的错误不再发生。这次经历也会成为我职业生涯中宝贵的教训,提醒我在未来更加严谨细致。
查看8道真题和解析
点赞 评论 收藏
分享
个人情况:河北人,双末九,电子信息,通信但因硕士方向原因知识忘光;转JAVA中道崩殂只会硬背八股,不会框架力扣;一段腾讯半技术岗实习,干了仨月Excel;一个全是水的论文,一个没下来的专利投递策略:基本都央国企,工作地济南=青岛=天津>石家庄>北京,岗位每家公司不一样,运营商投的都是网络部,银行都是科技岗,能源类基本数智化相关,其他啥顺眼投啥(八股拷打不投,手撕不投)部分投递与offer:运营商山东移动省公司—offer,已签两方交保证金,等上家毁约山东电信省公司—offer,但当时已经有移动了放弃河北联通省公司—offer,不等毁约放弃山东联通省公司—冲突没笔试天津三大运营商—打听到待遇一般没面北京移动—AI面后无后续总部都没有面试通知银行(都是裸考)中行—笔试跟移动撞了,选了移动建行—笔试寄,一个没进面农行—只进了农行雄研的面,但面试与邮数冲突去了邮数;河北山东省分和农数都没进面工行—山东省分、石家庄市分面试撞了且都跟河北联通省公司撞了,选了河北联通,有点后悔;天津市分进面没去邮储—北京数据中心差额体检ing交行—河北省分等递补民生总、中信总、华夏总、渤海总、浙商总、平安市分、招商市分—各种原因都没去面恒丰—没明确挂,可能在递补齐鲁—笔试没来得及参加投了一堆城商行但没参与后续流程电力系统国网—专业代码原因无缘南网—面了广东电网、南网数字,均寄华电—“青年骏才”面试通过,双选时天津分公司打了电话,但很奇怪我问签了三方毁约很晚能否接受,对方说你有意向来就等,我说我有意向,但是那个电话之后再无其他消息国能—直招没消息国电投—笔试忘了做了大唐—没去笔试华能—笔试与山东移动面试撞了,放弃三桶油中石油—华北油田数智化offer,因工作地放弃中石化—与华电笔试撞且人不在笔试地,放弃中海油—发太晚了已无面试想法其他荣耀—offer,签三方但是已经提出毁约,只是要等四月(还是很感谢前不着村后不着店时候荣耀给的offer稳住了心态,毁约纯个人原因与荣耀无关)航空工业计算所、一汽大众、中国通号研究院—offer,放弃个人感受从城市上来看,无论国企还是私企,二线城市难度高于一线,北方尤甚,因为本身可供选择的企业太少,导致想回家的人都在扎堆,且有些二线城市基本只能校招一步到位,想在一线干几年再回去不容易。央国企的话,面试过程对做技术的同学来说显得过于潦草且无法发挥优势(当然对我这种菜狗会比技术面试更友好),运气成分占比很大,无论是筛选、进面还是最后结果,我感觉能比较稳的最后寄了,反而是没啥希望顺手去一趟也没准备什么的给过了,所以不要all in任何一家也不要胆怯任何一家。至于个人选择,我还是想去生活和心理压力小的地方和企业,面试时候一问抗压就是铿锵玫瑰,实际一干就是一碰就碎;工作量现在新人不管去哪都躺不平,所以不指望真朝九晚五一杯茶一张报过一天,主要还是在自己的一般承受范围内。人把自己当个物件卖出去时候,除了问自己“值不值”,也得多问一句到底“想不想”。欢迎大家来评论区讨论~~
国央企求职进展汇总
点赞 评论 收藏
分享
评论
36
201
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务