我是y哥的读者,已经毕业几年了,一直在做业务开发,最近想要跳槽,自然就会读读y哥写的对线面试官系列,毕竟现在面试都得搞八股文啊。
上次吐槽完并发的知识,过了个中秋节,我已经看完对线面试管系列的《Java集合》和《Java虚拟机》的章节了,本来不想写了,后来y哥说还是有些读者爱看,我顺便也想总结下,所以又来了。
对于《Java集合》这个章节,y哥只写了两篇,一篇是List,另外一篇是Map。对于List的话,没啥好说的,挺简单的,问到了感觉就是嘎嘎的送分题。唯一值得复习的就是CopyOnWriteArrayList,顺便看下CopyOnWrite机制就完事了。
对于Map的话,也没啥好说的,当年校招的时候几乎是必问的,不知道现在还问不问呢?我感觉还是会问的吧。来来去去其实也是那么几道题,不过y哥没有写HashMap扩容的过程,也没有补充ConcurrentHashMap的原理啥的,有点可惜,不知道第二季会不会写呢。其他的题大多数都还记得,校招的时候都背过,问题不大。
《Java集合》这两章我过得特别快,主要ArrayList和HashMap天天用,大概还是记得一些常见的面试题的,不过对于扩容啥的,平时也不太关心这个过程,在实际使用只要记住结论:在创建的时候预估好对应的大小,那就是最佳实践。
送分送分送分!
按这对线面试官的目录顺序,我把《Java虚拟机》这块也在中秋的时候啃了,还是老样子,工作了几年, 没在公司调优过《Java虚拟机》。在面试的时候肯定会准备,但经过一阵子业务的洗礼后,毫无例外的又全忘了。。。
这几年,只调整过最大堆和最小堆的值,除此之外,没有对虚拟机做过任何的调整了,并且这几年用的都是JDK 8版本,使用的垃圾回收期都是CMS,甚至还没用过G1,就别说ZGC了。
现状就是这样,说出去都有点丢人,又好像没啥办法,可恶。
《Java虚拟机》这个章节的内容设计还是挺不错的,从编译到执行的过程再一步一步引出垃圾收集器,虽然最后水了个调优,总体的观感还是不错的,也回忆了不少当年校招时背过的问题。
《Java编译到执行的过程》在理解的角度下,它的过程很容易懂,但是不靠记忆在面试的时候压根没办法准确表达每一个步骤出来,这么多的步骤下,感觉在面试的过程很容易就会嘴瓢。
说起这个过程,我记得我曾经在大学的时候做过不少有关初始化的Java笔记题,大概就是static代码块/构造器/static变量初始化/成员变量初始化 这时间进行组合,然后看它的打印顺序,还有什么i 、 i类似这种题。
当年我还是很猛的,研究了好长时间,几乎都知道它的顺序是什么样了。现在要是在业务代码里看到这种代码,铁翻开commit记录,看看是哪个小瘪三写的代码。。。正常人谁会写这样的代码啊。
《双亲委派机制》这个写得挺好的,我在知乎也看到过y哥发布的这篇文章,还是挺多赞的。这个类加载机制很容易理解,以Tomcat为例是如何打破双亲委派机制的也好理解,但就是要记住它的类加载器结构图也还行,就是不知道什么时候会再次忘掉。
《JVM内存结构》又是需要用到大量记忆的东西,把class文件加载到JVM后,就会有对应的运行时区域,而运行时区域由几块逻辑分区组成->堆/方法区/栈/虚拟机栈/程序计数器。在面试的过程中又要把这几部分的每一块区域的所负责的内容以及组成都给讲一遍,着实难顶啊。
《垃圾回收机制》我认为讲述的就一个事:定义垃圾,使用算法回收垃圾。那关键词就是:可达性分析算法(如何找出垃圾)和垃圾收集器(垃圾回收算法的具体实现)。而分代啊,堆的内存空间什么1/3是年轻代啊,什么Minor GC,什么卡表啊,很大程度上只是某个版本JVM的的内容(主要就用在CMS垃圾收集器行),在这章节写上我认为就不合适了。
《CMS垃圾收集器》有了前面的铺垫了以后,知道了堆的组成以及布局了之后,最直接的就是为什么会有CMS垃圾收集器的诞生了。核心就在于,JVM回收垃圾是一定会发生STW的。CMS就是想要STW时间更可能的地短,于是把垃圾回收的步骤给做得更细。那CMS垃圾收集器考的实际上就是它的过程:
《G1垃圾收集器》在CMS垃圾收集器里,堆的内存是物理连续的,是由物理地址隔开每个区域空间的,CMS会有内存碎片和内存空间预留的问题,这会导致STW时间不可控。那G1就诞生了,希望将STW做到尽量可控(即便不是每次都把所有的垃圾给清除掉)
把内存划分叫做Region,Region分了不同的角色,还是会有新生代/老年代的概念。用Rset处理跨代引用的问题,使用SATB算法来处理「并发标记」阶段对象引用可能会修改的问题....
服了,CMS和G1垃圾收集器的过程算是全忘光了,以前也看过些ZGC的内容,现在也已经回忆不起来了,y哥也没有写这方面的内容。算了,暂时摆烂吧。
《JVM调优》这块我看y哥也没聊到啥,无非就是转了个话题给面试官聊JVM一般用不着调优,调优也就那么几个命令看看内存信息啊,看看基础的信息啊,看看线程信息啊。然后JIT优化技术那块也挺扯的,不同的JVM实现都不一样,没啥好说的。
其实在业务系统里一般都是自己的代码写得烂才要调优。
其实我也不知道社招会不会问JVM八股文这种东西,。跟不少的同事也聊过,LeetCode不刷是会忘的,八股文不看也是会忘的,那既然大家都是忘的,为啥就来考我呢?宁愿累死自己,也要卷死同事?
我看目录也没什么章节了,估计很快就被我刷完了,等我刷完了去实践一把看看效果。