四面技术,一面HR。
一面:
1.1、把你最近一个项目的流程图画出来并说明每个模块都是干嘛用的你负责哪些模块。
答:笔者画了流程图,讲解了每个模块的功能及他们之间的关系,以及每个模块用到的哪些新技术。(感觉答得一般,口才不好)
1.2、说一下ThreadLocal
笔者有段时间研究过这个ThreadLocal,但是并未真正用过,之前也没有复习,然后就直接说没用过了。
见:https://blog.csdn.net/qq_35689573/article/details/88780703
1.3、创建线程池用Executors还是ThreadPoolExecutor?
Executors有四种创建现成的线程池配置策略,见:http://www.cnblogs.com/dolphin0520/p/3932921.html
ThreadPoolExecutor需要自己配置核心线程数、最大线程数、空闲线程数、拒绝策略。笔者刚开始用的是Executors,后来看了阿里巴巴开发手册里面建议用ThreadPoolExecutor,之后笔者就一直用的是ThreadPoolExecutor了。
答:用ThreadPoolExecutor,因为ThreadPoolExecutor可以自己配置核心线程数和最大线程数。
1.4、ThreadPoolExecutor一般配置的是无界队列还是有界队列?
答:无界队列
1.5、无界队列不会造成内存溢出吗?
答:不会,因为可以配置空闲线程数。
反思:这块是读者搞混了,我实际上用的是有界队列(如:new LinkedBlockingQueue<Runnable>(workQueueCount))配置的空闲线程数。
1.6、那你一般怎么配置线程池?
答:看cpu内核数,一般最大线程数配置成cpu核数的1.5-2倍。
1.7、如果是IO密集型的应该怎么办?
答:增大线程数。
1.8、如果有32个cpu,是IO密集型,配置64个线程可以吗?
答:那得看内存。
1.9、内存很大,128个G。
答:理论上感觉是可以,但是会不会有我没想到的地方。
1.10、画一下jvm的内存结构图。
答:画了一个内存结构图:堆、虚拟机栈、本地方法栈、方法区、程序计数器。
1.11、写了一个常量字符串,问我存在方法区还是存在常量池中?
答:常量池。后来反应过来,常量池不就在方法区里面吗?又进坑了。
1.12、垃圾回收器有了解过吗?
答:垃圾回收器有7种。
1.13、你对哪种有了解,了解的程度?
答:都有了解,您说的了解程度是有多深?
1.14、CMS垃圾回收的标记过程?
答:初始标记,并发标记,重新标记,并发清除。
1.15、CMS垃圾回收有一定的缺陷,知道是什么吗?
答:会产生浮动垃圾,因为在并发清除阶段程序依然在运行。
1.16、对jvm参数在服务器上的配置有了解吗?怎么优化一般都?
答:要看程序是IO密集型还是cpu密集型。
1.17、IO密集型的呢?
答:那就用默认的。
1.18、默认的是那种?为啥要用默认的?
答:新生代用parNew,老年代用CMS,serial old做后备预案。
1.19、为什么?
因为CMS是基于低停顿时间模型的。
1.20、知道LRU吗?
答:最近访问的?
1.21、对,如果我要只保留最近访问的,剩余的清除怎么做?用java实现
答:可以用redis的zset。
1.22、用java实现
答:我想了一下,那就用集合吧,用LinkedHashMap。
1.23、为什么用LinkedHashMap?
答:LinkedHashMap会把最近访问放在最后,我们只需要把前面的删掉就能留下最近访问的。
1.24、spring的AOP是基于什么实现的?
答:基于动态代理。
1.25、动态代理有CGLib和Proxy两种方式,有什么区别?
答:我没了解过这个。
1.26、用过volatile吗?
答:用过,之前统计一个sql连续执行时间超过30秒的次数,用的static volatile统计的。
1.27、为啥不用AtomicInteger,AtomicInteger可以保证原子性啊?
答:用的static volatile AtomicInteger统计的。
1.28、linux的shell脚本用过吗?
答:常用的用过。
1.29、跟踪日志
答:tail -f 文件名。
1.30、给用户赋权
答:假如是给用户、组合其他赋全部权限的话,chmod 777 文件路径。
1.31、给文件重命名
答:我一般都是mv 源文件 目标文件名。
二面:
2.1、上来就问我Proxy和CGLib的区别?
答:不太好大着脸再直接说不了解,试着说了一下,Proxy使用的类反射,第一次访问可能性能会比较差,最后我没了解过这个。
2.2、SpringIOC里面用到了哪些设计模式?
答:单例模式,spring的bean默认都是单例的,工厂模式,beanFactory负责输出bean。
2.3、还有呢?
答:不知道了?面试官说:嗯,主要的都说了(泪流满面啊)
2.4、数据库用过oracle和mysql,是吧?
答:嗯,是的,用的oracle多一点?
2.5、oracle没用过,没用过的这个咱就不问了(好认真啊,笑哭)
2.6、kafka、rabbitmq,这两个消息中间件,怎么保证一条消息成功到达消费端。
答:那我先说kafka吧,kafka从生产者和消费者两个层次来说,生产者有个request.require.ack参数设置为-1保证消息成功到达kafka服务器并成功备份,消费端要确保消息不被丢失就要注意偏移量的提交,我们一般都用同步和异步结合的方式保证偏移量的正确提交。
2.7、如果生产者有两条同样的消息,怎么保证消费只消费一条?
答:这个用kafka应该保证不了了,那我们用rabbitmq吧,其实我心里想的是因为第一条消息没有成功到达消费者,所以才会发第二条同样的消息,第一条没有成功到达,就是没有正确路由到队列中,就到了备份交换机了。再发一条就可以了。
2.8、两条消息都能成功到达消费端呢,怎么保证消费端只消费一条消息?
答:给每条消息建一个hashCode,保证唯一性,然后轮询DB。转念一想性能不太好,想到了redis,可以用redis的bitmap来实现。
2.9:、如果发生了线程冲突呢?
答:加个悲观锁synchronized。
2.10、如果在分布式环境呢?
答:加个分布式锁。
2.11、分布式锁了解过吗?
答:没有。(下去了解一下,嗯,好的)
2.12、你常见的异常都有哪些?
答:空指针异常,数组下标越界异常,RunTimeException、IOException、InterruptedException、OutOfMemeory异常、stackOverFlow异常。
2.13、见过stackoverflow异常吗?
答:没有,一般都不会超过栈深度的。
2.14、zookeeper启动后会是什么什么的?(其实没太理解他的问题)
答:说了一通zookeeper的选举机制,我看到他在zookeeper的旁边打了一个?号,zookeeper我确实就是搭建过环境,知道他kafka是如何配合工作的,其他就不太熟了。
2.15、zookeeper你们都是怎么用的?
答:都是和kafka配合使用的,奥,没单独用过吗?没有。画了?号。
2.16、说出你用到的springCloud组件?
答:eurake、config、zuul、feign。
2.17、他们之间消息是如何流通的?
答:用户发送一个请求给server1,server1需要去server2请求数据,server1先去eurake中心获取server2的实例名及端口号,zuul路由到指定路径,通过feign实现信息的读取和交换。
2.18、如果要改配置文件,在不停止服务的前提下如何让应用实现配置文件的修改?
答:使用config配置中心和bus总线,config中心更改了配置文件,通过bus总线通知相关服务,相关服务器去config中心读取更新的数据并实现应用的自动重启。
三面:
3.1、都用过哪些设计模式?
答:单例模式,工厂模式,观察者模式,责任链模式,状态模式,门面模式,代理模式
3.2、责任链模式是什么?
答:就是发送一个请求,有很多种处理方法,然后向下传递,找到最合适的那个处理方法。
3.3、责任链模式有一个缺陷知道是什么吗?(全程超级严肃,面无表情)
答:想了一会,不知道。
3.4、如果链太长和话,会影响响应性能,你想那么一长串链吗?(大致就是这个意思吧,原话记不太清了)有什么解决方式吗。换个设计模式?
答:奥。那用状态模式?不对,策略模式?意思相近,但是不是策略模式。
3.5、为什么要换工作?
答:为了给公司创造更大的价值,(笑),说点实在的,为了个人发展吧等等。
3.6、springSecurity的安全什么?(这个题也没太听清)你是就是用过springSecurity,了解他的原理吗?
答:是的,就是用过,不了解。
3.7、网络IO了解吗?
答:不了解。至此三面整段垮掉,开始感觉完了。面试官说要开会走了。
四面:
4.1、linux的shell脚本熟悉吗?
答:知道常用的
4.2、查看一个文件有多少行?
答:犹豫(其实我根本就是忘了),tail -n(面试官,啊,笑)实际是(wc -l 文件名)
4.3、ack用过吗?
答:没用过。
4.4、说一下static吧
答:一般用static来修饰方法和字段。(估计面试官想问的不止这些)
4.5、ThreadLocal了解吗?(全程都在很温和的笑)
答:好像是....(被打断,说的可能太离谱,心想:我真的没关注过ThreadLocal怎么老是问这个问题)
4.6、用过ThreadLocal吗?
答:没有(没用过那就算了)
4.7、如果我现在有一个58.com的实体类,里面有一个num属性,我现在想把一个ArrayList集合里面的所有这种对象按照这个num属性的大小进行排序,怎么做?
答:用TreeSet,实现comparator接口做个比较器。
4.8、看过源码吗,都看过什么源码?说一下你看源码的收获
答:看过集合的源码,spring的源码,tomcat的源码
4.9、说一下spring源码你都学到了什么吧?
答:我说就看过一遍,但是没看懂,感觉还要再看几遍才行(面试惊讶,看了一遍??哈哈,说完觉得自己好像在吹牛,确实粗略看过一遍,只不过是跟着一本书看的,书上只写重要的模块重要功能,并不是每个类都看了),spring加载配置文件会有几种不同的方式(说完感觉像没说一样);beanFactory一般采用懒加载,调用getBean()方法才开始实例化,ApplicationContext服务启动就会加载其中定义的bean到Spring容器中;spring的事务模块处理都封装在tx模块,下面包括hibernate、jta,mybatis。。。
4.10、JTA?JTA不是在mybatis下面吗?你知道JTA是干嘛的吗
答:不知道。
4.11、了解类反射吗?
答:嗯,用来反射来生成一个对象。
4.12、还能用来干嘛?
答:想了半天,面试官的提示说用类反射调用方法之类的。
4.11、为什么要换工作?
答:因为现在。。
4.12、发展有局限性了是不?
答:赶紧点头答是的是的,(他一直在看表,估计有急事,听不完我说完了,都替我说了)
4.13、好了,你还有什么要问我的吗?
答:嗯?还有面试吗?
4.14、咋的,你有事儿啊?
答:没有。
4.15、你是想知道自己挂了没有是吧?
答:我笑了笑,没说话。
五面(HR):
5.1、介绍一下你自己
5.2、说说你的项目经历
5.3、为什么换工作?
5.4、如果我明天给你offer,你还会继续找工作还是回去提离职?
5.5、结婚了吗?
凭着记忆整理出这些,给自己做反思和记录,给你们做参考。面试官有些话是我凭着记忆填出来的,大概意思对,并不是原话,各位看官就不要挑刺了啊。
几位面试官都很认真,很用心,和他们一起共事应该能学到很多东西。