记一次被面试官坑的经历:
面试官看完我的项目经验,让我抽一个记忆深刻的项目给他讲讲。
我回答,这几个项目都是我亲自负责的项目,我都记忆深刻,这样吧,就拿第一个给你讲讲吧……。
我简单介绍到,这个项目,大量使用了分布式的定时任务时,面试官问,你定时任务是怎么做的?
我跟他说了集群是负载均衡的且高可用的,然后单台服务器上实际上用的Java Scheduler的API,面试官就问你知道Scheduler的底层原理吗?
我回答,我没有看过它的源码,所以具体说不出来,但是,根据我的经验,可以来分析一下:它底层应该是用的while循环,不停地去检测是否到了时间,如果时间到了,就执行……面试官打断我,一脸鄙视,说不是这样的,然后我说:如果不是用while循环,那可能用的类似于sleep或者wait的技术……面试官不耐烦了,说他想问的不是这个意思,他强调底层实现原理是什么,我说,就是类似于sleep和wait啊,至于更底层的原理,那是C语言写的,可能和操作系统有关,我就不清楚了。他很不耐烦的提醒我,调度器里面的任务是保存在什么地方的?我回答,你问的是这个啊!应该是保存在一个队列里面,比如List,面试官问,确定是List?我说我不确定,也可能是其他的队列,比如Queue。
(具体的谈话,记得不是很清楚了,大概是这样)
另外,当时介绍项目时,吞吞吐吐的,感觉有些吃力,我也跟他说明,这个项目做了3年,主要功能都有上百个,里面的技术细节也比较复杂,比如负载均衡和高可用问题,做的是各个节点均等的集群模式,另外,还比如Java Class的热加载技术等。
后面,我去看了一下Java Scheduler的源码,它是用DelayQueue队列存放任务线程的,计算时间,表面上看,确实是用的while循环,每次循环检查一下到期时间,但仔细分析源码,其实while循环只是一个方面,另一个方面,while循环时,还执行了sun.misc.Unsafe.park(false, time)方法,类似于sleep,是在native代码层面做的线程等待,实际上跟我猜测的一致,只是面试官想要的回答是DelayQueue,而我却没catch到这个点,我认为重点不在于task队列存放在哪里,而在于怎么实现定时调度的,实际上底层原理就是while循环 + 类似于sleep的Unsafe.park等待。
总结,阿里的面试也有几轮了,4年前就面过,那时候太天真的,一点准备都没有,什么JVM啊,把我问蒙了————我自学Java,一切以实用为主,可以说,我对JVM细节不甚了解,我也没空去研究一个对我没多少用的东西,但是这并不妨碍我出色的完成各种工作、解决项目中的难题,我虽然没有研究JVM,但是却研究了Struts、Spring等框架及其设计思想,研究工程算法,研究模板引擎,并形成了自己的作品:ZolltyMVC框架,jretty-log库,zollty-tmpl.js模板引擎等。(后来,也有不少同事去了阿里,现在基本都是P7以上,他们应该知道我的技术能力)
其实在我看来,JVM不过只是一个工具而已,会用就OK,需要深入一点的时候,再去搜索一下资料,这种资料非常丰富,足以应对绝大多数问题。
如果非要研究JVM,那得深入到JVM的C语言源码、深入编译原理,这不是JAVA工程师该干的事情,应该找C语言工程师来看看源码,也不是什么难事。