先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
面试一般从介绍项目开始,在我的如何在面试中介绍自己的项目经验这篇博文里,给出了相关内容,但本文的主题是事先准备外带面试时引导,那么在面试前,该如何准备亮点呢?先从最值钱的分布式组件亮点准备起。
比如可以准备通过看日志,解决过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缓存,自然就会问了, 问题无非是怎么用?这你可以结合你的项目实际说,底层细节,这块网上资料太多。也就是说,通过项目介绍,你可以把面试官引导你准备好的话题上,这还不算,在回答问题的时候,你照样还能引导,如下给出些引导的技巧。
1 比如你在回答redis相关问题时,如果之前你没机会讲“排查因超时时间过长而引发的OOM问题”,那么还可以展开说,对redis,我还解决过xx问题,面试官自然会问了,然后再展开。
2 当你回答好redis问题后,可以再“顺口”说句,在我们项目里,除了redis外,还用过dubbo组件,结果过因dubbo超时时间过长而导致的问题。然后面试官自然就会问到这块了,你同样可以准备些dubbo底层细节的问题,这方面也很多资料。
3 在回答好任何数据库相关的问题,比如索引,JDBC等,你顺口说句,我在项目里,还通过执行计划(或Mycat)优化过SQL技能,然后然开。
4 在回答好任何集合(如ArrayList)方面问题时,你可以说,在遍历集合的时候,我们项目里会非常小心快速失效问题,然后展开。
5 在回答好任何线程内存模型,或被问到volatile相关问题时,你就说,我知道ConcurrentHashMap里用到volatile,我能具体说下吗?再结合这个对象,扩展到 线程并发话题,而且这还是结合底层代码讲的。
6 被问到任何异常处理问题,比如运行期异常,如何自定义异常,那么再引导到异常处理最佳实践。
最后
由于篇幅原因,就不多做展示了
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-qKW1e134-1713463317671)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!