十道JVM大厂面试题,看完直呼:太难了,2024年最新java基础面试题大全

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • .class 文件中的每一条二进制字节码指令(JVM指令) 通过解释器转换成机器码,然后就可以被 CPU 执行了!

  • 当解释器将一条jvm指令转换成机器码后,同时会向程序计数器递交下一条jvm指令的执行地址!

如图所示:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

② 虚拟机栈

虚拟机栈:线程私有,它的生命周期与线程相同。虚拟机栈是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

  • 每个栈由多个栈帧(Frame) 组成,对应着每个方法运行时所占用的内存。

  • 每个线程只能有一个活动栈帧,对应着当前正在执行的方法,当方法执行时压入栈,方法执行完毕后弹出栈。

  • 方法体中的引用变量和基本类型的变量都在栈上,其他都在堆上。

实例代码:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

流程分析:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

我们打断点来Debug 一下看一下方法执行的流程:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

接着往下走,使方法B执行完毕:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

然后方法A 执行完毕,其对应的栈帧出栈,main 方法对应的栈帧为活动栈帧;最后main执行完毕,栈帧出栈,虚拟机栈为空,代码运行结束!

③ 本地方法栈

本地方法栈:线程私有。本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。

一些带有native 关键字修饰的方法就是需要JAVA去调用本地的C或者C++方法,因为JAVA有时候没法直接和操作系统底层交互,所以需要用到本地方法!

④ 堆

堆:线程共享。Java堆是Java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。Java堆的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

  • 通过new关键字创建的对象都会被放在堆内存。

  • 方法体中的引用变量和基本类型的变量都在栈上,其他都在堆上。

  • Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称作“GC 堆”(Garbage)。

  • -Xmx -Xms:JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64。

⑤ 方法区

方法区:线程共享。方法区用于存储已被虚拟机加载的 *类信息(构造方法、接口定义)、常量、静态变量、即时编译器编译后的代码(字节码)*等数据。

  • 方法区在 JVM 启动的时候被创建,并且它的实际的物理内存空间和 Java堆一样都可以是不连续的, 关闭 Jvm 就会释放这个区域的内存。

  • 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:(java.lang.OutOfMemoryError:PermGen space、java.lang.OutOfMemoryError:Metaspace)。

注意:方法区是一种规范,而永久代和元空间是它的2种实现方式。

方法区的演进:

1.6 版本方法区是由 永久代 实现(使用堆内存的一部分作为方法区),且由JVM 管理。由Class、ClassLoader、常量池(包括StringTable) 组成。

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

Jdk 1.7 版本仍有永久代,但已经逐步 " 去永久代 ",StringTable、静态变量从永久代移除,保存在堆中。

1.8 版本后,方法区交给本地内存管理,而脱离了JVM,由元空间实现(元空间不再使用堆的内存,而是使用本地内存,即操作系统的内存),由Class、ClassLoader、常量池(StringTable 被移到了堆中管理) 组成。

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

⑥ 运行时常量池

常量池:可以看做是一张表,虚拟机指令根据这张常量表找到要执行的 类名,方法名,参数类型、字面量 等信息。

  • 常量池是*.class文件中的,当该类被加载以后,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实内存地址。

运行时常量池:是方法区的一部分。

String str = new String(“hello”);

上面的语句中变量 str 放在栈上,用 new 创建出来的字符串对象放在堆上,而hello这个字面量是放在堆中。

2、请问jvm垃圾回收是否涉及栈内存?

===================

不需要。因为虚拟机栈中是由一个个栈帧组成的,在方法执行完毕后,对应的栈帧就会被弹出栈。所以无需通过垃圾回收机制去回收内存。

3、虚拟机栈内存的分配越大越好吗?

=================

不是。因为物理内存是一定的,栈内存越大,可以支持更多的递归调用,但是可执行的线程数就会越少。

我们来看一张图:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

举例:如果物理内存是500M(假设),如果一个线程所能分配的栈内存为2M的话,那么可以有250个线程。而如果一个线程分配栈内存占5M的话,那么最多只能有100 个线程同时执行!

4、从JVM的角度分析,方法内的局部变量是否是线程安全的?

=============================

我们通过两张图去分析一下:

情况一:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

情况二:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

从图中得出:局部变量如果是静态的可以被多个线程共享,那么就存在线程安全问题。如果是非静态的只存在于某个方法作用范围内,被线程私有,那么就是线程安全的!

再来看一个案例:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

所以,该面试题答案是:

  • 如果方法内局部变量没有逃离方法的作用范围,则是线程安全的。

  • 如果局部变量引用了对象,并逃离了方法的作用范围,则需要考虑线程安全问题。

5、虚拟机栈内存溢出的情况有哪些?

=================

  • 虚拟机栈中,栈帧过多(方法无限递归)导致栈内存溢出,这种情况比较常见!

  • 每个栈帧所占用内存过大(某个/某几个栈帧内存直接超过虚拟机栈最大内存),这种情况比较少见!

如图所示,就是栈中栈帧过多的情况:

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

6、请你说一下JVM运行时数据区方法区的演进?

=======================

1.6 版本方法区是由永久代实现(使用堆内存的一部分作为方法区),且由JVM 管理。由Class、ClassLoader、常量池(包括StringTable) 组成。

  • 静态变量就存放在永久代(方法区)上。

牛批!收藏过万的10道JVM技能题整理,吃透助你斩获3个大厂offer

最后

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
713455747471)]

[外链图片转存中…(img-K1OYOEH0-1713455747472)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-58FNxpmE-1713455747473)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值