【面试题】JVM篇-10道常见面试题p1,高并发解决方案 面试

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

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

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

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

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

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

正文

  • 虚拟机栈中引用的对象
  • 本地方法栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中的常量引用的对象

3.谈谈对 Java 中引用的了解?


Java 具有四种强度不同的引用类型

强引用:被强引用关联的对象不会被回收。可以使用 new 一个新对象的方式来创建强引用

Object obj = new Object();

软引用:被软引用关联的对象只有在内存不够的情况下才会被回收。使用 SoftReference 类来创建软引用

Object obj = new Object();

SoftReference sf = new SoftReference(obj);

obj = null; // 使对象只被软引用关联

弱引用:被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾回收发生之前。使用 WeakReference 类来实现弱引用

Object obj = new Object();

WeakReference wf = new WeakReference(obj);

obj = null;

虚引用:一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象。为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收时收到一个系统通知

4.常用的垃圾收集算法有哪些?


一共有四种

标记-清除算法,会将存活的对象进行标记,然后清理掉未被标记的对象。它的缺点就是会产生大量不连续的内存碎片,导致无法给大对象分配内存。

在这里插入图片描述

标记 - 整理算法在虚拟机执行垃圾回收的过程中,先采用标记算法确定可回收对象,然后整理剩余的对象,将可用的对象移动到一起,使内存更加紧凑,连续的空间就更多。优点是不会有内存碎片。缺点是速度慢

在这里插入图片描述

复制算法会将内存分为等大小的两个区域,FROM和TO(TO中为空)。将被GC Root引用的对象从FROM放入TO中,再回收不被GC Root引用的对象。然后交换FROM和TO。优点是不会有内存碎片,主要不足是只使用了内存的一半

在这里插入图片描述

分代收集算法根据对象存活周期将内存划分为几块,不同块采用适当的收集算法。

一般将堆分为新生代老年代,老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法

  • 新生代使用:复制算法

  • 老年代使用:标记 - 清除 或者 标记 - 整理 算法

5.什么情况下会触发Full GC?


  • 调用 System.gc()

只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行不建议使用这种方式,而是让虚拟机管理内存

  • 老年代空间不足

老年代空间不足的常见场景为前文所讲的大对象直接进入老年代、长期存活的对象进入老年代等

面试官追问:这种情况如何尽量避免?

  • 应当尽量不要创建过大的对象以及数组。
  • 可以通过 -Xmn 虚拟机参数调大新生代的大小,让对象尽量在新生代被回收掉,不进入老年代。
  • 还可以通过 -XX:MaxTenuringThreshold 调大对象进入老年代的年龄,让对象在新生代多存活一段时间
  • 空间分配担保失败

使用复制算法的 Minor GC 需要老年代的内存空间作担保,如果担保失败会执行一次 Full GC

  • JDK 1.7 及以前的永久代空间不足

在 JDK 1.7 及以前,HotSpot 虚拟机中的方法区是用永久代实现的

当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,此时也会触发Full GC

面试官打断问:这种情况怎么避免?

为避免以上原因引起的 Full GC,可采用的方法为增大永久代空间转为使用 CMS GC

  • Concurrent Mode Failure

执行 CMS GC 的过程中同时有对象要放入老年代,而此时老年代空间不足(可能是 GC 过程中浮动垃圾过多导致暂时性的空间不足),便会报 Concurrent Mode Failure 错误,并触发 Full GC

面试官追问:说一下浮动垃圾是什么?

浮动垃圾是指并发清除阶段由于用户线程继续运行而产生的垃圾,这部分垃圾只能到下一次 GC 时才能进行回收(由于浮动垃圾的存在,因此需要预留出一部分内存,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。如果预留的内存不够存放浮动垃圾,就会出现 Concurrent Mode Failure)

6.说一下尽量避免内存泄漏的方法?


  • 尽量不要使用 static 成员变量,减少生命周期;

  • 及时关闭无用的资源

  • 不用的对象,可以手动设置为 null

7.谈谈你对类加载机制的了解?


img

虚拟机把描述类的数据从Class 文件加载到内存,并对数据进行校验转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制

其中类加载的过程包括了加载验证准备解析初始化五个阶段。其中验证准备解析 3 个部分统称为连接

面试官又问:这几个阶段发生的顺序一定是确定的吗?

加载验证准备初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)

8.类加载各阶段的作用分别是什么?


  • 加载:查找并加载类的二进制数据

  • 验证:确保被加载的类的正确性

  • 准备:为类的静态变量分配内存,并将其初始化为默认值

  • 解析:把类中的符号引用转换为直接引用

  • 初始化:为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化

最后

手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友

image.png

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

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

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

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

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

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

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值