十道JVM大厂面试题,看完直呼:太难了

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

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

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

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

  • 静态变量、StringTable 存放在堆中!

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

为什么要用元空间取代永久代?

因为永久代有以下几个弊端:

① 字符串常量池存在于永久代中,在大量使用字符串的情况下,非常容易出现OOM的异常。

② JVM加载的class的总数,方法的大小等都很难确定,因此对永久代大小的指定难以确定。太小的永久代容易导致永久代内存溢出,太大的永久代则容易导致虚拟机内存紧张,空间浪费。

③ 永久代进行调优很困难:方法区的垃圾收集主要回收两部分,常量池中废弃的常量和不再使用的类。而不再使用的类或类的加载器回收比较复杂,FULL GC 的时间长。

7、请问Java虚拟机中有哪些类加载器?

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

以 JDK 8 为例:

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

类加载器的优先级(由高到低):启动类加载器 -> 扩展类加载器 -> 应用程序类加载器 -> 自定义类加载器。

  • **启动类加载器(Bootstrap ClassLoader):**这个类加载器负责将存放在 JAVA_HOME/jre/lib 目录中的,或者被-Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。

  • **扩展类加载器(Extension ClassLoader):**这个加载器由 sun.misc.Launcher$ExtClassLoader 实现,它负责加载JAVA_HOME/jre/lib/ext目录中的,或者被 java.ext.dirs 系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

  • **应用程序类加载器(Application ClassLoader):**这个类加载器由 sun.misc.Launcher$AppClassLoader 实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

  • **自定义类加载器:**用户自定义的类加载器。

8、请你说一下类的加载的过程?

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

类加载的过程包括:加载、验证、准备、解析、初始化。其中验证、准备、解析统称为连接。

  • 加载:通过一个类的全限定名来获取定义此类的二进制字节流,在内存中生成一个代表这个类的java.lang.Class对象。

  • 验证:确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  • 准备:为静态变量分配内存并设置静态变量初始值,这里所说的初始值“通常情况”是数据类型的零值。

  • 解析:将常量池内的符号引用替换为直接引用。

  • 初始化:到了初始化阶段,才真正开始执行类中定义的 Java 初始化程序代码。主要是静态变量赋值动作和静态语句块(static{})中的语句。

9、请你说一下什么是双亲委派模型?

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

如图所示:

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

什么是双亲委派模型?

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人

[外链图片转存中…(img-dN3TTVPH-1710413333245)]

[外链图片转存中…(img-PlO8rlUV-1710413333245)]

[外链图片转存中…(img-DzcQ29wi-1710413333245)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-1sIQeZnj-1710413333246)]

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java虚拟机(JVM)是负责运行Java应用程序的软件。下面是一些常见的Java JVM面试及其答案: 1. 元空间会产生内存溢出吗?在什么情况下会产生内存溢出? 元空间不会产生内存溢出。元空间是JVM中用于存储类和元数据的区域,它的大小不受JVM堆内存限制。当元空间中的类和元数据数量超过了元空间的限制,会抛出OutOfMemoryError错误。 2. JVM内存模型中的哪些区域是线程私有的? JVM内存模型中,线程私有的区域包括程序计数器、虚拟机栈和本地方法栈。 3. 什么是OOM异常?它通常在什么情况下发生? OOM(Out of Memory)异常表示内存溢出。当JVM无法为应用程序分配足够的内存时,就会抛出OOM异常。常见的内存溢出情况包括堆内存不足、栈溢出和元空间溢出。 4. JVM的垃圾回收算法有哪些? JVM的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法。 5. 什么是垃圾回收器?JVM中有哪些常见的垃圾回收器? 垃圾回收器是负责执行垃圾回收的组件。在JVM中,常见的垃圾回收器包括Serial、Parallel、CMS和G1等。 6. JVM调优的方法有哪些? JVM调优的方法包括调整堆内存大小、选择合适的垃圾回收器、优化代码以减少内存占用、减少对象的创建和销毁等。 7. 什么是类加载器?有哪些不同类型的类加载器? 类加载器负责将类字节码加载到JVM中,并在运行时动态加载类。在Java中,常见的类加载器包括启动类加载器(Bootstrap Class Loader)、扩展类加载器(Extension Class Loader)和应用程序类加载器(Application Class Loader)。 8. JVM的性能调优工具有哪些? JVM的性能调优工具包括jstat、jmap、jstack、VisualVM等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值