阿里面试官面试题分享
大家好,作为阿里校招的面试官,分享一下我经常问的一些问题。目的是希望帮助参加校招的举一反三,当然也希望更多的同学能加入我的团队
1.基于BIO实现的Server端, 当建立了100个连接时, 会有多少个线程?如果基于NIO, 又会是多少个线程?为什么?
2.通常来说基于NIO实现的Server端, 会用多少个线程去处理IO事件, 为什么?
4.c glib和Java的动态代理相比, 具体有什么不同?
5.用Executors.new Cached ThreadPool创建的线程池, 在运行的过程中有可能产生的风险是?
6.new ThreadPool Executor(10,100,10,Time Unit.MILLISECONDS,new Linked Blocking Queue(10) ) ; 一个这样创建的线程池,当已经有10个任务在运行时,第11个任务提交到此线程池执行的时候会发生什么,为什么?
8.除了用Object.wait和Object.notiyAll来实现线程间的交互外, 你还会常用哪些来实现?
9.为什么Concurrent HashMap可以在高并发的情况下比HashMap更为高效?
10.Atomic Integer、Atomic Boolean这些类之所以在高并发时高效, 共同的原因是?
11.请合理的使用Queue来实现一个高并发的生产/消费的场景, 给些核心的代码片段。
12.请实现让10个任务同时并发启动,给些代码片段。
13.在Java程序运行阶段, 可以用什么命令行工具来查看当前Java程序的一些启动参数值, 例如Heap Size等。
14.用什么命令行工具可以查看运行的Java程序的GC状况, 请具体写出命令行格式。
15.用什么工具, 可以在Java程序运行的情况下跟踪某个方法的执行时间, 请求参数信息等, 并请解释下工具实现的原理。
16.当一个Java程序接收请求, 很长时间都没响应的话, 通常你会怎么去排查这种问题?
17.Java进程突然消失了, 你会怎么去排查这种问题?
2.通常来说基于NIO实现的Server端, 会用多少个线程去处理IO事件, 为什么?
4.c glib和Java的动态代理相比, 具体有什么不同?
5.用Executors.new Cached ThreadPool创建的线程池, 在运行的过程中有可能产生的风险是?
6.new ThreadPool Executor(10,100,10,Time Unit.MILLISECONDS,new Linked Blocking Queue(10) ) ; 一个这样创建的线程池,当已经有10个任务在运行时,第11个任务提交到此线程池执行的时候会发生什么,为什么?
8.除了用Object.wait和Object.notiyAll来实现线程间的交互外, 你还会常用哪些来实现?
9.为什么Concurrent HashMap可以在高并发的情况下比HashMap更为高效?
10.Atomic Integer、Atomic Boolean这些类之所以在高并发时高效, 共同的原因是?
11.请合理的使用Queue来实现一个高并发的生产/消费的场景, 给些核心的代码片段。
12.请实现让10个任务同时并发启动,给些代码片段。
13.在Java程序运行阶段, 可以用什么命令行工具来查看当前Java程序的一些启动参数值, 例如Heap Size等。
14.用什么命令行工具可以查看运行的Java程序的GC状况, 请具体写出命令行格式。
15.用什么工具, 可以在Java程序运行的情况下跟踪某个方法的执行时间, 请求参数信息等, 并请解释下工具实现的原理。
16.当一个Java程序接收请求, 很长时间都没响应的话, 通常你会怎么去排查这种问题?
17.Java进程突然消失了, 你会怎么去排查这种问题?
个别题个人的回答
1. BIO由于不是NIO那样的事件机制, 在连接的IO读取上, 无论是否真的有读/写发生, 都需要阻塞住当前的线程, 对于基于BIO实现的Server端, 通常的实现方法都是用一个线程去accept连接, 当连接建立后, 将这个连接的IO读写放到一个专门的处理线程, 所以当建立100个连接时, 通常会产生1个Accept线程+100个处理线程。
NIO通过事件来触发, 这样就可以实现在有需要读/写的时候才处理, 不用阻塞当前线程, NIO在处理IO的读写时,当从网卡缓冲区读或写入缓冲区时,这个过程是串行的,所以用太多线程处理IO事件其实也没什么意义,连接事件由于通常处理比较快, 用1个线程去处理就可以, IO事件呢, 通常会采用cpu core数+1或cpu core数*2, 这个的原因是IO线程通常除了从缓冲区读写外,还会做些比较轻量的例如解析协议头等,这些是可以并发的,为什么不只用1个线程处理, 是因为当并发的IO事件非常多时, 1个线程的效率不足以发挥出多core的CPU的能力, 从而导致这个地方成为瓶颈, 这种在分布式cache类型的场景里会比较明显, 按照这个, 也就更容易理解为什么在基于Netty等写程序时,不要在IO线程里直接做过多动作,而应该把这些动作转移到另外的线程池里去处理,就是为了能保持好IO事件能被高效处理。
从上面可以看出, 对于大多数需要建立大量连接, 但并发读写并不会同时的场景而言, NIO的优势是非常明显的。
这种关于BIO、NIO的问法的变化空间是非常大的, 还可以进一步拓展问问AIO和BIO、NIO的根本不同。
NIO通过事件来触发, 这样就可以实现在有需要读/写的时候才处理, 不用阻塞当前线程, NIO在处理IO的读写时,当从网卡缓冲区读或写入缓冲区时,这个过程是串行的,所以用太多线程处理IO事件其实也没什么意义,连接事件由于通常处理比较快, 用1个线程去处理就可以, IO事件呢, 通常会采用cpu core数+1或cpu core数*2, 这个的原因是IO线程通常除了从缓冲区读写外,还会做些比较轻量的例如解析协议头等,这些是可以并发的,为什么不只用1个线程处理, 是因为当并发的IO事件非常多时, 1个线程的效率不足以发挥出多core的CPU的能力, 从而导致这个地方成为瓶颈, 这种在分布式cache类型的场景里会比较明显, 按照这个, 也就更容易理解为什么在基于Netty等写程序时,不要在IO线程里直接做过多动作,而应该把这些动作转移到另外的线程池里去处理,就是为了能保持好IO事件能被高效处理。
从上面可以看出, 对于大多数需要建立大量连接, 但并发读写并不会同时的场景而言, NIO的优势是非常明显的。
这种关于BIO、NIO的问法的变化空间是非常大的, 还可以进一步拓展问问AIO和BIO、NIO的根本不同。
4. 简单点讲是CGLIB可以代理类,这非常有助于像Spring AOP增强这样的场景的实现
5. 这题比较简单,主要是在考察对自带的这些线程池API的掌握能力,有没有在用的时候仔细的去了解,newCachedThreadPool最大的风险就是可能会创建超多的线程,导致最后不能创建线程。
这道题稍微拓展开下可以顺带问问创建100个线程会耗费多少资源,一个Java进程能创建多少线程池是受什么限制?
14. 通常可以用jstat -gcutil [pid] [频率,例如多少毫秒一次] [多少次]来看目前的gc情况,如果已经打开了gc log,可以直接查看gc日志。
这种问题,稍微拓展下就可以看gc log通常怎么打开,具体的命令行参数,一段gc log的解读等。
15. btrace,Arthas,主要借助JVM attach agent,ASM以及Instrumentation来动态的替换字节码,从而实现动态的对程序运行情况的跟踪。
这题拓展开,可以问会有什么限制,这个可以进一步了解对原理的掌握程度,也可以请实际的讲一个借助这些工具排查的case,来看看实践情况。
欢迎入群交流面试经验,找我内推,我微信:jxiaoyu_ph
1. 提供咨询服务。让你及早了解相关内部信息,做好准备。比如如何写一封好的简历,面试推进的每个环节要注意什么
2. 部门,团队情况介绍。比如部门是否核心,和你匹配,hc 是否多。如果你想去其他部门我也可以帮你内推,打听情况
附上我部门介绍海报