前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

作者头像
养码场
发布2018-08-13 17:25:11
7060
发布2018-08-13 17:25:11
举报
文章被收录于专栏:养码场养码场养码场

上上周分享了占小狼面试阿里系的面经文章:《一位资深Java的阿里系公司实战面试经验,套路还是面试官的多》 ,蛮受大家欢迎的。看到大家在社群里的好评与点赞,占小狼本人很开心。

面经分享继续!这是占小狼求职阿里系公司过程中遇到的其他面试问题,现分享给大家。

希望能帮助大家顺利拿到理想Offer!

占小狼:一位奋斗在魔都的资深Java开发。去年6月在简书上发第一篇技术文章,已坚持发表76篇技术文章,粉丝数突破4000。有个人微信公众号:占小狼的博客,欢迎关注!~

-01-

volatile

面试场景对话:

面试官:说说volatile关键字的实现原理

我:volatile关键字提供了内存可见性和禁止内存重排序。

面试官:分别解释一下吧

我:因为在虚拟机内存中有主内存和工作内存的概念,每个cpu都有自己的工作内存,当读取一个普通变量时,优先读取工作内存的变量,如果工作内存中没有对应的变量,则从主内存中加载到工作内存,对工作内存的普通变量进行修改,不会立马同步到主内存,内存可见性保证了在多线程的场景下,保证了线程A对变量的修改,其它线程可以读到最新值…………

面试官:如何保证的?

我:当对volatile修饰的变量进行写操作时,直接把最新值写到主内存中,并清空其它cpu工作内存中该变量所在的内存行数据,当对volatile修饰的变量进行读操作时,会读取主内存的数据……

面试官:你知道系统级别是如何实现的么?

我:(what,what are u 说啥呢)我记得操作volatile变量的汇编代码前面会有lock前缀指令

面试官:你这说的还是代码层面,我说的是系统级别

我:(懵逼脸...)这个再底层下去我真的没研究过了...

细节问题▼

细节决定成败,在面试过程中,虽然也有运气的成分存在,但是对于细节的掌握程度,可以很好的衡量应试者的技术水平。

-02-

Object.finalize

面试场景对话:

面试官:和我讲讲Object类的finalize方法的实现原理

我:新建一个对象时,在JVM中会判断该对象对应的类是否重写了finalize方法,且finalize方法体不为空,则把该对象封装成Finalizer对象,并添加到Finalizer链表。

PS:完全没想到面试官会问这个

面试官:恩,然后呢?

我:Finalizer类中会初始化一个FinalizerThread类型的线程,负责从一个引用队列中获取Finalizer对象,并执行该Finalizer对象的runFinalizer方法,最终会执行原始对象的finalize方法……(这块逻辑有点绕,当时答的也有点虚)

面试官:Finalizer对象什么时候会在引用队列中?

我:在发生GC的时候,具体在什么时间点或如何被插入到引用队列中,这块实现我已经忘记了...

面试官:恩,你验证过finalize方法是否会执行么?

我:恩,自己写过例子证明过,也看过源码的实现。

面试官:怎么证明的?

我:初始化一个大数组,可以明显看出gc之后是否被回收,然后执行System.gc(),在finalize方法中输出信息 ……(把之前做过的验证说一遍)

面试官:恩,可以..

-03-

虚拟机JVM相关

这块内容并非每个面试官都会问,但是如果是应聘高级职位的话,这一环节是不可缺少的。

面试场景对话:

面试官:Java虚拟机有了解么?

我:恩,略有接触过...

PS: 话不能说太满,容易打脸。

面试官:我想了解下它的内存模型

我:Java堆,Java栈,程序计数器,方法区,1.7的永久代,1.8的metaspace....

PS:最好能把想到都讲出来,不要保留,不要等面试官问 “还有吗?”,简短描述下每个内存区的用途。

面试官:好,一般Java堆是如何实现的?

我:在HotSpot虚拟机实现中,Java堆分成了新生代和老年代,我当时看的是1.7的实现,所有还有永久代,新生代中又分为了eden区和survivor区,survivor区又分成了S0和S1,或则是from和to,其中eden,from和to的内存大小默认是8:1:1(各种细节都要说出来...),此时,我已经在纸上画出了新生代和老年代代表的区域

PS:这个时候,我要求纸和笔,因为我觉得这个话题可以聊蛮长时间,又是我比较熟悉的...一边画图,一边描述

面试官:恩,给我讲讲对象在内存中的初始化过程?

我:要初始化一个对象,首先要加载该对象所对应的class文件,该文件的数据会被加载到永久代,并创建一个底层的instanceKlass对象代表该class,再为将要初始化的对象分配内存空间,优先在线程私有内存空间中分配大小,如果空间不足,再到eden中进行内存分配...……

PS:千万不要只说,新对象在Java堆进行内存分配并初始化,或是在eden区进行内存分配并初始化。

面试官:恩,好,说下YGC的大概过程...

我:先找出根对象,如Java栈中引用的对象、静态变量引用的对象和系统词典中引用的对象等待,把这些对象标记成活跃对象,并复制到to区,接着遍历这些活跃对象中引用的对象并标记,找出老年代对象在eden区有引用关系的对象并标记,最后把这些标记的对象复制到to,在复制过程还要判断活跃对象的gc年龄是否已经达到阈值,如果已经达到阈值,就直接晋升到老年代,YGC结束之后把from和to的引用互换。

PS:能多说点就多说点,省的面试官再提问,我把老年代的cms回收也大致说了一遍,以为面试官会跳过这个话题了,还是太年轻了。

面试官:你刚刚说到在YGC的时候,有些对象可能会发生晋升,如果晋升失败怎么处理?

我:....(我记得我分析过这段代码的,但是印象不深刻了)我记得在标记阶段时,会把对象和对应的对象头数据保存在两个栈中,如果晋升失败的话,就把该对象的对象头复原...

面试官:那你在实际项目中有碰到这种情况么,会导致什么问题?

我:...(这我真没有遇到过)对,有遇到过一次,在分析gc日志的时候,发现YGC发生之后,日志显示gc后的内存变大了,后来查出来是因为对象的晋升失败造成的。

面试官:有过虚拟机性能调优的经验么?

我:(说实话,调优经验真的不多)恩,有一点吧,不是很足,就是我们XX项目上线的时候,发现YGC特别的频繁……通过调整新生代的大小(线上环境的虚拟机参数是默认的),同时检查业务逻辑代码……!

面试官:恩?还有么?

我:恩,经验确实有限,目前就根据这个项目做过一些相关的优化。

PS:面试这么久,好怕面试官的下一句是 “恩?还有么?”,显然面试官还不满足我的回答,但是我也只能答到这个地步了...

面试官: 。。。。。。

我:。。。。。。

面试官: 那我们看看别的吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 养码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档