java高级工程师匿名用户
1、 问:springmvc加载过程,答:把源码流程简单的说了一下(侥幸看过 spring 加载xml 和 springmvc的源码),其实还看过spring jdbc、事务的实现机制、aop 的实现机制(spring源码忘的差不多了,语言组织的不太好,也紧张,这么多年没面试过,只面试过别人)。
2、 问:爬虫难点, 答:没有啊。(哈哈,确实没有,基本大部分问题都能解决)
问:比如防爬策略,答:验证码、代理、登录、间隔时间, 爬虫没有深入问 (这方面感觉自己还是比较精通的(tcp、http 等))。
3、 问:新生代原理,答:把为什么要分新生代、老年代和持久代,并分别说了原理,垃圾算法分别也说了下。 (JVM 相关的知识只问了这点,类加载、垃圾回收、等好多知识都没问,jvm感觉还是比较有自信的)
4、 问:线程池参数、原理,答:介绍了一半的时候,面试官打断了我,说不用介绍了(J、U、C 包的内容,随便问,呵呵。简历上写熟悉感觉都有点谦虚,绝对的精通啊)。
5、 问:volatile ,答:语义、主内存、工作内存,可见性,内存屏障等。
问:volatile i++,有问题吗? 答:我说这个有点太简单吧,笑啦笑。
问:应该怎么做? 答:使用CAS。
问:CAS 怎么用?答:使用 atomic 包中的 AtomicInteger 等类。
问:ABA 问题怎么解决? 答:使用 AtomicReference 解决, 顺便我也提了下高并发下 LongAdder比 AtomicInteger更好,但没继续问 LongAdder的原理。
6、 问:forkjoin,答:把 forkjoin 原理说了下,(工作窃取算法)
7、 问:concurrenthashmap原理,答:我把1.7 的和 1.8的都说了下。
问:size 是怎么统计的。 答:瞬间懵了,只看过1.7的实现方式,然后说了怎么实现。 1.8的没看过,然后我说,让我实现了就用 cas去实现。
问:确实是这样实现的,答:(呵呵:结果还真蒙对了)。
8、 问:countdownlatch 原理,场景,答:使用AQS,原理说了下,顺便也把cyclicBarrier 和 phaser 也介绍了下。
9、 问:监控组件怎么做的? 答:把监控组件的功能简单的介绍了下(集成:只是一个jar包,项目引用即可), 使用jmx、dll动态加载(java 使用dll默认需要配置环境变量,我解决了不需要配置环境变量的问题)、重写 请求路由(页面在jar包中) 监控每个页面的访问量实现方式, 监控当前网站用户数的实现方式, 监控jdbc 使用的druid进行实现的 等信息详细的介绍了一遍。
问:我有没有持久化保存, 答:没有,如果实现也很简单,最简单的使用java 序列化。
问:没实现序列化重启就没,半成本啊。 答:面完想了想这个还真做序列化了,使用的json做的,因为还有查看历史的监控信息。
10、问:NIO(简单介绍了下,没深入问下去) 答:Buffer(堆内存、直接内存)、channel、selector ,和 bio的优劣,取舍。
11、问:InnoDB 的索引原理 简单的介绍了(聚簇索引和非聚簇索引的区别,B- tree,B+ tree B* tree)
12、问:Threadlocal 答:简单提了下。
13、问:了解设计模式吗? 答:看源码的时候了解过。
问:模版模式简单介绍下,答:噼里啪啦把原理说了下。
问:使用场景呢,那个开源项目中用到了 答:简单介绍了下,我说我写爬虫的时候,然后把使用场景也介绍了(开源的项目没看过,哭) 。
问:责任链模式, 答:责任链我说filter就这么实现的,准备将filter的实现原理,面试官说,不用讲了。(看过tomcat源码呵呵,难不倒)
14、问:倒排索引原理,答:把原理介绍了一遍(这个相信大家看过一遍都能明白,超级简单)。
15、问:mysql 查找 10 到20之间的数据,答:limit 。
问:后面什么参数,答:limit 10,10 (坑啊,想让我回答 limit 10,20 呢)。
16、问:写sql ,用户表(id,name);名字重复的,只留下一条不重复的数据,两分钟时间。 答:一听sql题,挺懵的,纸上手写,没把握。不过调整心态,很快写出来了,没有卡壳, select max(id), name from user group by name delete from user where id not in (上面的sql) (应该没用两分钟吧,自己都佩服自己居然瞬间写出来了) 还说了mysql中不使用 max(id) 直接写id也可以。mysql 中的sql不是严格的标准sql。
问:这都知道? 答:我说我研究过标准中sql。
17、问:有一个jar包,运行的时候,cpu 特别高,你应该怎么做? 答:要先判断是那个类,那个包引起的cpu效率问题,然后在排查。
问:怎么定位那个类, 使用jps 获取进程号, 根据进程号, 使用top -H等参数获取,占用cpu高的线程id,然后使用jstack获取堆栈信息,查找对应的线程id cpu占用高,基本是死循环执行代码引起的,通过堆栈信息就可以定位那段代码有问题 (这个回答面试官还是比较满意。) ,回答的不太好。
18、问:5000w数据自增,不连续,找出 500w数据,答:说的不太好,说了使用 redis存储,从redis中查找, 使用搜索引擎,然后查找。
答:你不是做过大数据吗?这个都不知道? 分而治之! 答:(好尴尬,问这个需求的时候还问面试官,5000W数据分表了吗?有分区索引吗?呵呵,就是没想起 分而治之。)不懂的。
19、问:redis,就知道存储能存 string、list、map、set。由于不熟没继续深入问下去(使用一致性hash解决扩容问题都没问道,这个还是知道的) 答:还说我,这都不知道还熟悉啊,尴尬!
20、问:有没有看过开源项目的源码?有没有看过一个消息队列的源码? 没有,因为工作中没用到,自己看的源码基本是jdk(并发、io、其它的等)的和tomcat、spring的
21、mybatis 中 # 和 $ 的区别。 答:好久没用了,都忘了。
问:那你们用啥? 答:hibernate。
问:这年底还有人用hibernate?(被鄙视了) 答:传统公司,没大数据,没并发。不同的客户的库使用不同,如果使用mybatis 数据库迁移就问题大的去了。根据业务场景选型,没有最好的技术,只有最适合的。
最后: 问:面试官说,你期望的薪资是多少 答:那我说可就高了,xxxxx。
问:工资还是跟人事谈吧,然后又说了好多。
问:我会帮你跟人力给你说好话的。噼里啪啦又说了一些,最后面试官来了句,你应该不用再面试其它公司了。