前言
春节过后招聘旺季就到了,不知道大家是否准备好了,面对金三银四的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们Java程序员来说,多数的公司总体上面试都是以自我介绍+项目介绍+项目细节/难点提问+基础知识点考核这个流程下来的。
有些公司可能还会问几个实际的场景类的问题,这个环节阿里是必问的,这种问题通常是没有正确答案的,就看个人的理解,个人的积累了。剩下的就没啥了,都是换汤不换药,聊项目就看你自己对你自己的项目是否理解的透彻。
由于资料内容太多,平台篇幅限制,小编就展现了以上部分面试专题与资料,如需获取以下全部面试资料,可以关注我私信**【JVM面经】** 免费获取。
JVM 是 Java Virtual Machine(Java虚拟机)
的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
每个Java程序都离不开Java虚拟机,Java程序的运行依靠具体的Java虚拟机实例。在Java虚拟机规范中,分别用子系统、内存区、数据类型以及指令这几个术语来描述的。这些组成部分一起展示出一个抽象化的虚拟机内部的抽象体系结构。
Java虚拟机主要分为五大模块:类装载器子系统、运行时数据区、执行引擎、本地方法接口和垃圾收集模块。其中垃圾收集模块在Java虚拟机规范中并没有要求Java虚拟机垃圾收集,但是在没有发明无限的内存之前,大多数JVM实现都是有垃圾收集的。而运行时数据区都会以某种形式存在于每一个JAVA虚拟机实例中,但是Java虚拟机规范对它的描述却是相当抽象。这些运行时数据结构上的细节,大多数都由具体实现的设计者决定。
正文
问题一:堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。
堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace
),新生代包含 Eden+Survivor 区
,survivor 区
里面分为 from
和 to 区
,内存回收时,如果用的是复制算法,从 from
复制到 to
,当经过一次或者多次 GC
之后,存活下来的对象会被移动到老年区,当 JVM 内存不够用的时候,会触发 Full GC
,清理 JVM 老年区当新生区满了之后会触发 YGC
,先把存活的对象放到其中一个 Survice 区
,然后进行垃圾清理。因为如果仅仅清理需要删除的对象,这样会导致内存碎片,因此一般会把 Eden
进行完全的清理,然后整理内存。那么下次 GC
的时候,就会使用下一个 Survive
,这样循环使用。如果有特别大的对象,新生代放不下,就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存活时间一般比较久远。
问题二:GC 的两种判定方法
- 引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就会回收但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)的情况
- 引用链法: 通过一种
GC ROOT
的对象(方法区中静态变量引用的对象等-static
变量)来判断,如果有一条链能够到达GC ROOT
就说明,不能到达GC ROOT
就说明可以回收
问题三:SafePoint 是什么
比如 GC 的时候必须要等到 Java 线程 都进入到 safepoint
的时候 VMThread 才能开始执行 GC,
- 循环的末尾 (防止大循环的时候一直不进入
safepoint
,而其他线程在等待它进入safepoint
) - 方法返回前
- 调用方法的 call 之后
- 抛出异常的位置
问题四:GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
先标记,标记完毕之后再清除,效率不高,会产生碎片
- 复制算法:分为 8:1 的
Eden 区
和survivor 区
,就是上面谈到的YGC
- 标记整理:标记完毕之后,让所有存活的对象向一端移动
问题五:GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。
- 并行收集器:串行收集器使用一个单独的线程进行收集,GC 时服务有停顿时间
- 串行收集器:次要回收中使用多线程来执行
- CMS 收集器是基于“标记—清除”算法实现的,经过多次标记才会被清除
G1 从整体来看是基于 “标记—整理”算法 实现的收集器,从局部(两个 Region
之间)上来看是基于“复制”算法实现的
问题六:Minor GC 与 Full GC 分别在什么时候发生?
新生代内存不够用时候发生
MGC
也叫YGC
,JVM 内存不够的时候发生FGC
问题七:简述 java 垃圾回收机制?
在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。
问题八:类加载器双亲委派模型机制?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/59ada1bdd8d141da8771ee18be4bf370.jpeg)
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
va面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!**