如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?

1 简历上多积累商业项目经验,而且里面用到的技术尽可能是Java的,如果你可以凑出半年商业项目经验,那绝别写5个月。如果是毕业生缺乏商业项目经验,也得多找些学习项目写到简历上,至于帮老师干的项目以及实习项目,那当商业项目写。

2 一般职位介绍里,大多提到SSM,Oracle等技术,这些技术在你的项目里,至少应该用过其它类似吧,那么别客气,这些技术关键字尽可能地出现在你简历中的项目介绍里,比如人家要有Oracle经验,你哪怕是有MySQL,也写上,不写就说明你没数据库开发经验,写了就算有相关经验,类似技术点也照此办理。

3 每份工作的技术要求一定不同,那么你在投简历前,一定得微调,在你项目里做过的前提下,尽可能在你这份简历中,体现出相关技术。

一般对出初级开发,如果没至少半年Java(可能再具体下是SSM等框架)商业项目经验,而且简历里看不到职位介绍里出现的数据库,框架等技能关键字,这份简历基本没机会,高级开发一般是要3年相关经验。

这里不提倡编项目,也不提倡编技术,即你项目里没用到的技术你写到简历中,但话说回来,一般公司要求的技术都很普通,你在项目里哪怕没做过,好歹同事有人做过,你可以看下相关代码,或者你参与过调试此类问题。所以哪怕是初级开发,你的技能应该能对上大多数职位介绍,如果对不上就学,也应该很快能对上,只要你的简历上有足够的java商业项目经验,而且出现大多数技术关键字,至少能有面试机会。

2 结合项目和线上问题,优先准备分布式组件的亮点

面试一般从介绍项目开始,在我的如何在面试中介绍自己的项目经验这篇博文里,给出了相关内容,但本文的主题是事先准备外带面试时引导,那么在面试前,该如何准备亮点呢?先从最值钱的分布式组件亮点准备起。

比如可以准备通过看日志,解决过redis,dubbo等方面的线上问题。这块其实连初级开发也有机会接触,比如Dubbo方面,超时时间没设好,比如设了10秒,平时没事,但一旦订单模块调风控模块出错,过了10秒再返回出错,这样导致整条(基于http的)链路长时间保持,累计起来就导致资源耗尽最终系统崩溃,或者redis超时时间没设或设置很长(1个星期),导致redis的内容在内存中缓存过多,导致OOM问题。这些问题,哪怕是初级开发,应该也有机会接触。

这方面该怎么准备? 1 简历上写上在项目里用过Redis或Dubbo组件,并排查过类似问题 2 看些基本的redis和dubbo接口方法 3 尤其看些可能导致问题点的配置,比如超时时间怎么设 4 复习下linux命令,了解如何通过linux命令看日志排查问题。

上述是最基本的,如果有MyCAT,Netty,Kafka方面的经验,比如Mycat分库字段怎么设,解决过Netty半包和粘包问题,Kakfa解决过因消息重发而导致的不幂等问题,你都可以写到简历上作为亮点。但本文给出的保本技能亮点,比如redis和dubbo超时而导致的问题排查,应该大家都有机会接触。

3 别光背题,要结合项目讲,最好结合你解决过的线上问题讲

网上有不少分布式(以及其它方面)的面试题,比如netty或dubbo底层细节问题,这些有用,但如果你背熟了,面试里最多得到的评价是“了解分布式组件理论”,聊胜于无,如果对于要有分布式组件经验的工作,你就悬了。对于分布式组件,大家实现该如何准备呢?(其实后文提到的亮点也一样)

1 一定要应用在项目里,因为面试官只关心对应的商业项目经验,比如你的dubbo是用在订单系统调会员系统方法里,你的mycat,netty等是用在什么场景,这点简历上未必能体现出,但面试时一定要说,这样能证明你用过。

2 分析问题的能力优于开发能力,所以你最好再结合一个场景说明,比如在项目介绍时,你外带一句,dubbo方面我解决过因超时而导致的问题,然后等面试官来问,问的时候,你大致说下,然后面试官看你对linux看日志的命令,以及dubbo关于超时时间的配置以及问题上下文说得没毛病,那么应该也就信了。

3 这时可以再结合一些面试题准备下细节,比如看netty堆外内存,线程模型,redis数据结构。有些面试官听你说出解决问题的说辞,可能就不问了,有些可能会再问些底层问题,那么你这时候再说下。

这里大家可以对比下两种表现方式,一种是什么也不准备,或者只准备背网上的题目局,等面试官问,那么面试官一定不客气,想到哪问哪,比如netty会问很细,你平时的项目经验未必涵盖到,如果你再无法结合应用讲清楚,那面试官可能认为你只有理论经验。另一种是项目介绍时抛出,而且找机会通过解决过的实际问题抛出,外带稍微了解下细节,这样不仅能很容易让面试官感觉你有实际项目经验,更能展示“看日志解决实际问题”的能力。两者差别一看就知道,更何况其实只要方法得到,准备其实也不难。

4 准备数据库调优和虚拟机调优及排查oom问题的说辞

按值钱的技能排序,对于一般的初级和高级开发而言,除了分布式组件,下面就是调优方面的能力了,具体可以是分布式调优,这之前讲过, 还有数据库调优和虚拟机调优。同样除了在简历上明写之外,还该做哪些准备呢?

数据库跳调优方面。

1 熟悉索引,包括索引结构,复合索引和回表,这块应该大家都会说,同样要结合项目案例说。

2 单机版,通过看执行计划,调优SQL语句,这块怎么准备?项目中,会在linux上设置,如果有超过10秒的SQL就打印出来,然后通过执行计划看耗时点,比如大多是走全表扫描,或者有了索引没用到,或者子sql运行了多次,再往深讲就是Oracle里连接方式不对。你通过执行计划看到问题所在后,就对应修改,比如建复合索引,或者通过with语句把子查询提取出来。

总之这里你得体现出通过日志看长sql,以及通过执行计划看耗时点。至于如何修改,大多数候选人都能说,但你更知道前两点, 就比别人强了。

3 如果你感觉还有能力,可以再讲些MyCAT分库分表和redis方面的调优能力,毕竟这块涉及到分布式组件。这方面可以准备的项目说辞是:比如业务请求里,会经常用公司ID向风控模块看风险情况,那么就可以用ID做键,风控字段做值,另外再把null放到键里,以放缓存击穿。另外对于一个千万级别的大表,你可以用ID作为分表字段,分10个表,根据最后一位的值定位到具体的表。同时排查所有的SQL语句,把一些可能全表关联的SQL语句,比如带group by和多表关联,或者用Java业务写,或者优化。同时再网上看些面试题准备些相关MyCAT和Redis的语法说辞。这样你会额外增加“分布式性能调优”方面的经验。

在虚拟机方面,我另外有篇博文:在面试中如何展示虚拟机和内存调优技能,大家可以照着准备,总之也是先结合项目展开,然后围绕虚拟机结构展开调优技能,再可以照这篇文章内部类、final与垃圾回收,面试时你一说,面试官就知道,进一步展示你的能力,同时再能照如下的范例,说出你解决过的OOM问题。

第一步,发现系统很卡,或者日志里频繁出现OOM异常。第二步,用dump文件看OOM时的内存镜像,看的工具可以是JMAT。这两个步骤是通用的。

第三,通过dump文件,再结合日志上下文,发现了OOM的原因,比较简单的原因是Redis缓存超时时间过长,或者是ThreadLocal里的对象用好没remove(这块还涉及到弱引用,大家可以自己去查,本文不展开),或者创建线程池时,等待队列设置成了无界,或者你在mybatis里,where条件都是带if的,即如果传入id和name再拼装where id = xxx之类的语句,在一种场景里,都没传条件,所以where后面不带条件,把数据库里记录全捞出来了,导致OOM。

如果你再经历过,甚至可以说到Netty堆外内存管理不善而导致的问题,如果能说到这个程度,甚至面试架构师都行。

第四是解决,发现问题后,对症下药解决就很容易,比如降低Redis超时时间,或者修改好对应的代码。但既然你说是根据线上问题排查出来的,那么就得说如何解决,善始善终。总之这里是结合线上问题发现的,所以就别说些因Connection对象没关闭,大的HashMap用好没clear之类的问题了,倒不是这些原因不会引发OOM问题,而是这些问题大多会在上线前测试阶段解决掉了,你再把它们说成线上问题,可能会暴露你们项目组能力不行。

5 java核心方面,准备集合,线程和异常处理等方面的亮点

通过上述分布式组件和调优方面的说辞,你展示的能力已经比别人强很多了,虽然相比之下,java核心方面的能力属于单机版的技能,但毕竟属于基础技能,你除了基本问题之外,也得适当准备亮点。如下给出些同样适用于初级开发的亮点。

1 集合方面,可以准备下HashMap和hashcode的底层代码,同样可以准备下ArrayList和快速失效(fast fail)的底层代码,然后再进一步看下ConcurrentHashMap的读写并发管理部分的代码,因为其中包含volatile,散列表数据结构和线程并发部分的技能,而且jdk1.7和1.8 ConcurrentHashMap的底层代码实现起来还不同,你如果找到机会通过这个对象展示多线程并发和数据结构的能力,或许Java核心方面,面试官就不问别的问题了。

2 线程方面,准备下锁,volatile,线程池和ThreadLocal的说辞,具体通过ConcurrentHashMap了解下锁(1.7)版本和synchronized+volatile(1.8版本)的用法,以及ThreadLocal里可能引发内存泄漏的问题,这些点网上都有,本文就不展开了,其实也未必多,能讲清楚就行了。

3 异常方面,准备下你在项目里的异常处理方法实践说辞,比如尽量缩小try…catch的范围,finally从句里放释放资源的代码,catch里应尽量处理异常,先用IOException等专业异常处理,再用Exception兜底,以及尽量缩小异常的影响范围,别让程序一遇异常就崩。

Java核心方面,其实还有很多可以挖掘的点,比如String, final关键字等,而且Java核心方面,网上面试题太多了,这里就不再展开了。同样这里要结合项目案例,比如在测试阶段发现了因为遍历集合而导致的问题,同时展开快速失效,或者在压测阶段发现因HashMap在高并发场景下丢数据所以用ConcurrentHashMap,同时展示其中的volatile和并发等细节。

其实上述技能不复杂,初级开发照样能说,但涉及到了底层代码,尤其ThreadLocal还涉及到弱引用和OOM问题,更能体现实力,哪怕你经验未必比人家多,但你面试时能结合底层代码展示,想都不用想,面试官一定看好你。

6 介绍项目时,抛出准备过的亮点,别展开

上文里给出的是面试准备的技巧,按值钱角度分析,讲了分布式组件、数据库和JVM调优以及Java核心方面的技能,更重要的是,你是结合实际项目准备的。

台上一分钟台下一年功,如果准备得当,面试时你就可以发挥了。先是在自我介绍环节,你除了介绍基本情况学校学历外,还可以综合说明,比如用过Redis组件,有过数据库和JVM调优经验,有过压测经验(下文会讲),有过排查OOM方面问题的经验等,总之别客气,准备了就说。

然后进入到项目介绍环节,除了介绍项目背景,开发情况以外,你再结合业务说,这里给出若干说辞范例。

1 这个项目里,我们用到了Dubbo作为模块间的调用,我除了写代码外,还解决过因dubbo超时也引发的问题(别展开)

2 在数据库方面,我除了实现技能外,还做了数据库调优,具体用过索引,执行计划,redis缓存和MyCAT分库分表,最后两点自己斟酌。

3 在项目里,每个请求我们会用一个线程处理,其中用到了ThreadLocal对象(结合业务引出ThreadLocal),对此我还解决过因ThreadLocal和线程池设置不当而引发的OOM问题。同时这里可以抛出准备过的其它OOM问题说辞。

4 在这个项目里,我参与过压测,并在压测过程中解决过 OOM问题,并通过看日志优化代码,从而改善了系统的响应时间。

5 在这个项目里,我会结合Cat系统监控长SQL问题,一旦出现,我会通过看Linux日志排查问题。(展示看日志排查问题的能力,同时可以进一步展示你准备过的技能)。

大家可以看到,上述结合项目抛出的亮点时没有展开,因为这时属于项目介绍阶段,如果展开的话可能会让面试官感觉你条理不清晰,而且抛出的亮点都是属于分布式和调优等高级技能。对一些Java核心方面的单机版技能,别人或许当成宝,你可能都掌握的值钱技能太多,都不算什么了。当然,后面有机会,你还是要展示Java核心部分的亮点,只是优先讲更值钱的。

7 回答技术问题后,可以引导到你准备过的亮点上

你介绍项目时,由于已经抛出了足够多的亮点,所以后面面试官自然而然就会往这方面提问,这样就达到了引导效果。比如听你讲到Redis缓存,自然就会问了, 问题无非是怎么用?这你可以结合你的项目实际说,底层细节,这块网上资料太多。也就是说,通过项目介绍,你可以把面试官引导你准备好的话题上,这还不算,在回答问题的时候,你照样还能引导,如下给出些引导的技巧。

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

[外链图片转存中…(img-g9SL34Ed-1714195436085)]

[外链图片转存中…(img-ytSGOQmK-1714195436085)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值