美文网首页Android Tech资源JAVA
关于Java面试,你应该准备这些知识-续(20170324更新)

关于Java面试,你应该准备这些知识-续(20170324更新)

作者: 美团Java | 来源:发表于2017-03-14 18:01 被阅读33359次

    简书 占小狼
    转载请注明原创出处,谢谢!
    如果读完觉得有收获的话,欢迎点赞加关注

    愿你被这个世界温柔以待


    《关于Java面试,你应该准备这些知识点》 一文的阅读量和点赞程度可以发现,貌似大家更喜欢这类文章,也许是技术型的文章看着比较的枯燥,这些只是我近段时间求职面试时所遇到的一些问题,整理出来希望对有需要的同学提供帮助,可以更系统的去学习各个知识点。

    虚拟机JVM相关

    这块内容并非每个面试官都会问,但是如果是应聘高级职位的话,这一环节是不可缺少的,面试的难易程度也不一样,有些面试官或许让你讲讲虚拟机的内存模型即可,有些也会让你解释垃圾回收的实现,当然也会有虚拟机调优的实战经验,线上问题排查等等。

    场景对话:
    面试官:Java虚拟机有了解么?

    我:恩,略有接触过...(水哥说过,话不能说太满,容易打脸)

    面试官:那你先讲讲它的内存模型吧

    我:Java堆,Java栈,程序计数器,方法区,1.7的永久代,1.8的metaspace....(噼里啪啦概念讲一通,简短描述下每个内存区的用途,能想到的都讲出来,不要保留,不要等面试官问 “还有吗?”)

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

    我:在HotSpot虚拟机实现中,Java堆分成了新生代和老年代,我当时看的是1.7的实现,所有还有永久代,新生代中又分为了eden区和survivor区,survivor区又分成了S0和S1,或则是from和to,(这个时候,我要求纸和笔,因为我觉得这个话题可以聊蛮长时间,又是我比较熟悉的...一边画图,一边描述),其中eden,from和to的内存大小默认是8:1:1(各种细节都要说出来...),此时,我已经在纸上画出了新生代和老年代代表的区域

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

    我:(千万不要只说,新对象在Java堆进行内存分配并初始化,或是在eden区进行内存分配并初始化)要初始化一个对象,首先要加载该对象所对应的class文件,该文件的数据会被加载到永久代,并创建一个底层的instanceKlass对象代表该class,再为将要初始化的对象分配内存空间,优先在线程私有内存空间中分配大小,如果空间不足,再到eden中进行内存分配...^&&*%

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

    我:先找出根对象,如Java栈中引用的对象、静态变量引用的对象和系统词典中引用的对象等待,把这些对象标记成活跃对象,并复制到to区,接着遍历这些活跃对象中引用的对象并标记,找出老年代对象在eden区有引用关系的对象并标记,最后把这些标记的对象复制到to,在复制过程还要判断活跃对象的gc年龄是否已经达到阈值,如果已经达到阈值,就直接晋升到老年代,YGC结束之后把from和to的引用互换(能多说点就多说点,省的面试官再提问,我把老年代的cms回收也大致说了一遍,以为面试官会跳过这个话题了,还是太年轻了)。

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

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

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

    我:...(这我真没有遇到过)对,有遇到过一次,在分析gc日志的时候,发现YGC发生之后,日志显示gc后的内存变大了,后来查出来是因为对象的晋升失败造成的。(我隐约记得看过笨神的一篇文章,回答的心里很虚)

    面试官:(没有反驳,继续问)有过虚拟机性能调优的经验么?

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

    面试官:恩?还有么?

    我:(面试这么久,好怕面试官的下一句是 “恩?还有么?”,显然面试官还不满足我的回答,但是我也只能答到这个地步了...)恩,经验确实有限,目前就根据这个项目做过一些相关的优化。

    面试官: 。。。。。。

    我:。。。。。。

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

    关于虚拟机方面的文章,我针对hotSpot的实现写了一些分析,感兴趣的同学可以看看,这些文章看着确实有点枯燥。

    相关文章:
    JVM源码分析之JVM启动流程
    JVM源码分析之堆内存的初始化
    JVM源码分析之Java类的加载过程
    JVM源码分析之Java对象的创建过程
    JVM源码分析之如何触发并执行GC线程
    JVM源码分析之垃圾收集的执行过程
    JVM源码分析之新生代DefNewGeneration的实现
    JVM源码分析之老年代TenuredGeneration的垃圾回收算法实现

    细节问题

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

    volatile

    场景对话:
    面试官:说说volatile关键字的实现原理

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

    面试官:分别解释一下

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

    面试官:如何保证的?

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

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

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

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

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

    相关文章:《java volatile关键字解惑》

    Object.finalize

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

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

    面试官:恩,然后呢?

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

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

    我:(努力回想中)在发生GC的时候,具体在什么时间点或如何被插入到引用队列中,这块实现我已经忘记了...(我真的忘记了,只记得这块逻辑太复杂了)

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

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

    面试官:怎么证明的?

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

    面试官:恩,可以...

    相关文章: 《深入分析Object.finalize方法的实现原理》

    大问题

    什么是大问题,就是问题很大,让你自己去理解,把你的毕生所学都拿出来.

    场景对话:
    面试官:如果给你一个系统,如何去优化?

    我:(优化什么?性能,稳定性,还是其它方面,只能硬着头皮上了,结合自己做的一个项目)
    1、分析系统,定义指标
    2、通过系统埋点,收集指标的度量值,对指标进行迭代优化&&^%&$#

    面试官:就这些?没了么?

    我:(因为是电话面试,感觉当时脑袋是空白的,估计和面试官的级别也有关系)如果指标是接口性能的话,可以看下系统内存是不是可以使用缓存进行性能上的优化,比如redis,如果是访问很频繁又不会经常变动的数据,如热点数据,可以直接使用本地缓存进行优化,毕竟一次网络请求也需要1~2毫秒

    面试官:没了么?

    我:(因为自己系统优化的经验确实不丰富,让面试官觉得怎么就只能想到如此少的优化点呢)数据库的读写分离,数据库的分库分表,如果经常条件查询数据库的话,可以引入搜索服务es或则lucene进行优化

    相关文章

      网友评论

      • 86150c3fcce0:jmm不是jvm内存结构
      • freeman0432:那你先讲讲它的内存模型吧?下边你回答的不是内存模型啊,是内存区啊
        freeman0432:@占小狼 :smile: 好吧,改一下,别误导小白
        美团Java:@freeman0432 嗯,当年也把这个弄混了,面试官自己也混了
      • 阿尔法_dog:都是演员
      • aed10c4f298e:很好,受教了
      • 最帅楠宝宝:楼主写的不错啊,多交流交流
      • 爱看书的小平头:说实话,我很少这么仔细而且是反复的看一篇文章了。感谢狼哥给的灵感
        美团Java:@爱看书的小平头 看的哪一偏文章
      • cd13856c86e2:阿里确实会这样
      • cd13856c86e2:谁是水哥?
        美团Java:@Leon惊叹号 就是用眼睛分辨水的那个人
      • 骑着红驴逛青楼:为了避免越问越深~我的回答就是不了解:stuck_out_tongue_winking_eye:
      • cmazxiaoma::sweat:楼主牛逼 找实习单位的时候,这些问题面试官也问了
        美团Java:@cmazxiaoma 一般都会问的
      • shit_cfd4:大神,太深了,还没毕业的 很多看不懂 然后跟着你说的看之前要看什么什么的 然后里面又有更多要看的 哇 心疼自己,本来觉得自己了解一点点底层很牛逼了 ,哎 发现越学越多不会啊
        美团Java:@shit_cfd4 加油
      • hongrm:volatile的系统实现依赖于mesi和内存屏障,下面这篇推文的存储一致性那里有讲到
        http://mp.weixin.qq.com/s/zgyuZbwgKd4dMfQxtjzaaQ
      • 4ef2a02860cb:这种。。我觉得我宁愿像google那样每轮leetcode hard。。
        美团Java:@Vicissitud_b2b6 :+1:
      • 莫那一鲁道:volatile 系统级别的实现? 小狼后来明白了吗?据我所知,volatile生成的代码会加入lock前缀,那么就是在cpu指令级别实现了总线加锁。跟操作系统还有关系吗?求解答!
        美团Java:@西平县县令 对的
        西平县县令:@占小狼 是不是想问的是cpu缓存失效呀
        美团Java:@stateIs0 没有,我当时也是答到#lock指令,系统级别的还不清楚
      • 7f890dc10a53:楼主您好,最近看了您的几篇文章,觉得收获很大。最近也在找工作,请问下楼主netty框架源码应该重点学习哪些方面呢 谢谢啦:blush:
        美团Java:@ahu_coder 感谢肯定哈
        7f890dc10a53:@占小狼 嗯嗯 好的 谢谢您啦 你写的文章对我的帮助很大:grin:
        美团Java:@ahu_coder 线程模型,实现原理
      • 20107a7e33ec:你这面试的时p几呀:flushed:
        美团Java:@湿人和远方 哪个?
        20107a7e33ec:他那个面试评级怎么来的,
        美团Java:这个和级别没关系啊
      • 梅小西爱学习:来膜拜下大神,没想到我司居然隐藏着这一尊大神!必须赞赏支持,希望小狼大神多多分享干货!
        美团Java:@wxweven 感谢
      • 2445968f2c69:你是我哥,我都工作一年了 感觉咱两一个天上一个地上。我大致浏览你所有的文章 不错 ,思维逻辑很紧,调理很清晰!哎。。看来我要走的路还很长,得好好努力了。很高兴看见了你的文章 真心不错 三克油!:+1:
        美团Java:@蚕小豆 多谢支持啊
      • 怀瑾握瑜同学:楼主我有个疑问。如果问Java内存模型的话,回答的是内存布局么,还是主存与工作内存这些。
        美团Java:@小枫_cc50 我觉得都可以扯的啊
      • 原水寒:狼哥,mysql、spring也写一篇呗
        美团Java:@微服务小白 不才啊,对mysql,spring不够精通,不敢乱写
      • 2299eb13c5b7:JVM还有能理解,后面的基本就很难懂了,我敲了三年代码,我肯定从事的是假IT,对3年经验的真的会面试那么深吗?
        美团Java:@什么要发生 嗯
        274ee7e729e9:@占小狼 回答得出更多,评级应该也会更高吧
        美团Java:@独自等待_7c4b 如果你都能回答,会一直问下去
      • ea6cff6cab5a:前辈你好,感觉我们是一个面试官:smile:,问的很多是一样的,电话面试了一个小时多点,java和jvm上除了两个问题外都能答上来,就是互联网方面的因为没有做过相关项目比如分库分表这样的没答上来,最后给的建议是技术深度够了,但广度和业务上不够,这样就是没戏了吧,我去年毕业的:joy:
        美团Java:@skywalker_821a 要不简历给我,我看看?
        ea6cff6cab5a:@占小狼 没有
        美团Java:@skywalker_821a 那就是没戏了,关键没经验,你找好工作了么?
      • wyn_做自己:看完感觉到真的受到伤害了,原来成长空间这么大,多谢分享,另外,我转载了可否
        美团Java:@wyn_做自己 哈哈哈,可以转载啊
      • MJM_佳敏:看来我进阿里无望了T.T
        美团Java:@MJM_佳敏 哈哈,那就有针对性的去一个一个攻克
        MJM_佳敏:@占小狼 看网上被阿里面试官虐的文章看多了吧...:sob:
        美团Java:@MJM_佳敏 为啥呀
      • 489fd585c53e::+1: 敢问一下这是什么级别的面试?
      • fbc2be83f5db:楼主最后去阿里了吗?我也拿了offer,没想好去不去
        美团Java:@crashed 哈哈,钱给够了就去嘛
        fbc2be83f5db:@占小狼 这样啊,自我感觉跟阿里价值观不太符合,不知道去不去:joy:
        美团Java:@crashed 没去啊
      • Owen_Yuan:面试的啥公司啊,还问到操作系统级别,答上来能证明什么?证明工作时间不饱和啊,要么哪来的时间研究这么深:scream:
        RaRaLei:@Owen_Yuan 赞同啊,有些知识只有工作中用到了才会有深刻体会
        4e34bdcfcb25: @Owen_Yuan 很有道理
        美团Java:@Owen_Yuan 哈哈哈哈,都要跳槽了,工作时间当然不饱和了
      • 胡家三少:刚毕业一年不到,单位有点坑,学不到东西。感觉自己的基础性知识还行,上面的那些问题我大部分都能答的不错,就是项目经验不足,还在纠结要不要辞职中。。哎
        美团Java:@胡家三少 跟着自己规划走
      • 白马王朗:最后一题,我有一些见解~系统优化,可以分为各个方面,小狼一定是紧张啦~你可以从系统方面优化,也可以从代码方向优化,可以从使用的容器,框架,数据库,系统架构,等等方面进行优化,虽然我实战的优化不多,但这就是面试经验呀😂希望你写出更优秀的文章~
        Franky木下:@米有昵称 电面,肯定是杰克马老板家。
        白马王朗: @占小狼 哪家
        美团Java:@米有昵称 确实,当时是电话面试,突然懵了,没反应过来
      • d4b9d40f29e0:谢谢楼主分享:+1:
      • Lucky_Light:给楼主点赞,那些喷子就不用理会了,眼不见心不烦。
        美团Java:@Lucky_Light :+1:
      • BlueFish0323:非常不错,点个赞收藏了!
        另外:有些喷子楼主就当不存在吧,跟这种人较劲是浪费时间!
        美团Java:哈哈,谢谢支持,本来没打算和他费口舌了
      • 淡淡的伤你:点赞
        美团Java:@淡淡的伤你 :sunglasses:
      • 8351ae8a3b5e:作者几年工作经验啦?之前看过jvm的书,表示大部分都忘记了,源码倒是没有研究过:dizzy_face:
        pengp:同问
      • 近半生少年:看了这个,我感觉我经历的面试好一般啊
        美团Java:@Tesiro灬 阿里的
        近半生少年:@占小狼 你的是哪里的面试啊,我去过网易,京东,乐视和人人网,结果我感觉最难的是人人网。。。人人网和你这个有一拼。
        美团Java:@Tesiro灬 哈哈,你要把你知道的和面试官说
      • 4656036c559d:🙏
        4656036c559d: @占小狼 其实都碰过壁
        美团Java:@小学没毕业zZ 你这个表情好
      • 18f6e8464f76:想问下楼主面的什么级别的岗位?
        还在实习,看完这面试题觉得自己不仅仅是菜……
      • 蚂蚁学Python:volatile,jvm,hashnap,concurrenthashmap,线程池,这些真的是最近经常的面试题,能像文主这样都是从源码来讲解的绝对高水平,膜拜了!
        美团Java:@麻神无易 这些都是基本功,面试考察的就是基本功和项目经验
      • YGUaDw:很不错。看得出来作者下过苦功。

        PS:楼下J某的评论实在恶心。一副很屌很了不起的样子说着跟本章内容无关的东西。
        美团Java:@某瓜 他是来刷存在感的
      • fattiger:请教个问题 jvm部分说到了堆栈 其中栈在执行本地native方法时 存放的什么:yum:
        美团Java:@fattiger 也是native方法的参数和需要的内部方法所需的变量啊
      • 再无人像你:狼哥,我把你写的博客全过了一遍,可是我发现只能看懂三四篇你的文章,其余的都看不懂,我工作一年了,这个正常吗?
        美团Java:@人来人往_f3ae 哈哈,多谢了哈
        再无人像你: @占小狼 哈哈哈 狼哥 我把你分享了朋友圈
        美团Java:@人来人往_f3ae 正常的,加油
      • 特工达文西:楼主面的什么岗位啊,是要去跟笨神做同事吗?🤓
        美团Java:@特工达文西 这个具体岗位我也不太清楚
        特工达文西:@占小狼 能否透露一下是哪方面的岗位呢,最近也面过,但是问的东西完全不一样。
        美团Java:@特工达文西 没有啊,笨神那边要求太高,还达不到
      • 1c06a008c7c4:多谢你
      • MOVE1925:真干货!!!最近面试问的java基础问题总回答不上来,项目经验没有,只写过一些模块,捉急啊...这文章真及时
        4e34bdcfcb25: @FzeroL 基础问题不是项目经验多就能回答上来的,基础问题要靠学习!
        美团Java:@FzeroL 哈哈,希望能提供一点方向
      • c55d781b7f8f:楼主那方法区这个东西,在1.8还存在吗?还是1.8移除的永久代就是指方法区?
        美团Java:@Chris_Andersen 这个我也不确定,都是一些概念性的东西,不用太纠结的
        c55d781b7f8f:@占小狼 恕我愚昧~那意思就是1.8不存在方法区了吧
        美团Java:@Chris_Andersen 1.7的永久代也是一块内存,方法区是在永久代里面的,存放class数据对应的元数据,1.8已经没有永久代了,使用metaSpace代替存放这些数据
      • 文曜繁星:面试的是阿里吗,问的东西确实挺细的。
        美团Java:@周融一 大部分是吧
      • 48e3e7b2e792:点一个赞
      • 31b9ca3e2c2f:这些问题以前为了面试专门看过,不过都忘了,现在再看看,又有些新的收获
        美团Java:@yshyshaxw :smirk:
      • Enjay:作为一个些前端的人,从来不说我看不懂他写是什么,不明觉厉!:grin:
        美团Java:@Enjay 我以前也是写前端的
      • movingtarget:看完了感觉自己没学过java,不好意思用java写大作业了……
        美团Java:@我若是海 加油
      • dfe147f4a102:很厉害的感觉 没接触过 现在面试Java都要这水平了?
        c2585584a462:@占小狼 小狼面的什么职位
        美团Java:@_v君 看你面试什么职位了
      • 虫二无边:这个才是干货
        美团Java:@金河 :sunglasses:
      • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/439c17 欢迎点赞支持!
        欢迎订阅《java进阶之路》https://toutiao.io/subjects/85249
      • 60a00f70ca33:占位收藏
        美团Java:@昵称有重复 :heart_eyes:
      • 土牛肉干:已点喜欢
      • tc_小菜鸟:我感觉我啥也不会
        美团Java:@tc_小菜鸟 学习是一个过程,以前的我也不会
      • c214aa30cbfd:努力,成为那个幸运的人
        美团Java:@真卡拉卡密欧是也 加油
      • d43a8cf92910:阿里的面试吧。。
        美团Java:@JerryZhu9203 都有的
      • 彩笔_7138:这周周四去面试😬😬😬不知道面试官是不是也看小狼的文章
        美团Java:@彩笔_7138 怎么讲?
        美团Java:@蜗牛加速飞 你是段子手
        a9f0f91b91fd:看了还好,你也看了,万一面试官灵机一现:
        面试官:我今天时间有点,你给我写出红黑书的旋转逻辑,写完后,给我稍微讲解下就行~
        彩笔:。。。。。。。
        面试官:怎么了?
        彩笔:手写写不出来,一般都习惯ide的提示了,
        面试官:小狼,给我拿台笔记本,顺便把IntelliJ IDEA打开,
        彩笔:哎呦,哎呦,我肚子疼。。。。。。
      • MiBoy:水哥还说过:我不与谁争,谁与我争,我也不屑
        美团Java:@clearbug 最强大脑
        754c54f0ba62:@占小狼 水哥是谁?
        美团Java:@MiBoy 水哥的文学功底也很深
      • 北京程序猿:昨天我也去面试去了😂
        美团Java:@JasonQiang 加油,估计还有一轮
        北京程序猿: @JasonQiang 你在魔都,我在帝都~技术面四面,一轮主管面,面试是通过了,现在处于谈判的状态 😂
        美团Java:@JasonQiang 哪里面试?
      • 北京程序猿:已关注你☺
        美团Java:@JasonQiang 多谢支持
      • 北京程序猿:如果面试官这么问我的话,我答的比你浅多了
      • Hidetag:完了,做安卓的完全不知道这是啥,除了同步关键字和
        8a8dfae746af:dalvik和jvm实现还是很大区别的^_^
        5e7ef718227f:@占小狼 安卓不是不一样。只是安卓很多开发者使用第三方的东西。内部已经优化好,没有后台那么多用户进行并发,自然性能问题,要求不严格,大体app能跑,就没有去优化。等出问题才去优化,但是问题又不经常发生,自然就不谈楼主那些技术点。
        美团Java:@S_H_I_E_L_D :joy:,难道安卓的不一样?
      • a9f0f91b91fd:面试官:嗯,前面我们也聊了很多,最后一个问题,感觉你长得比我帅,为什么?
        小狼:因为你技术比我好~
        面试官:嗯,这个问题回答的比较透彻,~欢迎加入西部世界真人虚拟环境研发组~
        4e34bdcfcb25: @蜗牛加速飞 以后可以有机器人面试管
        美团Java:@蜗牛加速飞 哈哈哈
      • chiweng2009:温柔以待
      • 普罗米修斯是谁:先点个赞👍
        美团Java:要点喜欢啊

      本文标题:关于Java面试,你应该准备这些知识-续(20170324更新)

      本文链接:https://www.haomeiwen.com/subject/gyzcnttx.html