上篇整理了下后面准备更系统化写的Java编程进阶的思路,若是仅看里面的词,不少同窗会以为都懂,但我真心以为没有多少人是真懂的,因此简单的想了一些题目,感兴趣的同窗们能够来作作看,看看本身的Java编程水平怎么样。java
懒得去作小程序了,因此你们就直接回复你的答案吧,我会来一一点评下,友情提醒下,有些题目有点坑。数据库
基于BIO实现的Server端,当创建了100个链接时,会有多少个线程?若是基于NIO,又会是多少个线程? 为何?编程
一般来讲基于NIO实现的Server端,会用多少个线程去处理IO事件,为何?小程序
一个典型的客户端集群->LB->服务端集群这样的结构中,如客户端采用链接池,长链接的方式,这种设计你以为可能会出现什么问题?若是客户端采用的是单个长链接的方式呢?若是有问题,你以为应该怎么解决?数组
cglib和Java的动态代理相比,具体有什么不一样?缓存
在基于Netty实现FrameDecoder时,下面两种代码的表现会有什么不一样?服务器
第一种并发
private void callDecode(...) {less
List<Object> results = new ArrayList<Object>();高并发
while (cumulation.readable()) {
int oldReaderIndex = cumulation.readerIndex();
Object frame = decode(context, channel, cumulation);
if (frame == null) {
if (oldReaderIndex == cumulation.readerIndex())
break;
else
continue;
}
else if (oldReaderIndex == cumulation.readerIndex()) {
throw new IllegalStateException( ".....");
}
results.add(frame);
}
if(results.size() > 0)
fireMessageReceived(context, remoteAddress, results);
}
第二种
private void callDecode(...) {
int oldReaderIndex = cumulation.readerIndex();
Object frame = decode(context, channel, cumulation);
if (frame != null)
fireMessageReceived(context, remoteAddress, frame);
}
用Executors.newCachedThreadPool建立的线程池,在运行的过程当中有可能产生的风险是?
new ThreadPoolExecutor(10,100,10,TimeUnit.MILLISECONDS,new LinkedBlockingQueue(10));一个这样建立的线程池,当已经有10个任务在运行时,第11个任务提交到此线程池执行的时候会发生什么,为何?
实现一个自定义的ThreadFactory的做用一般是?
除了用Object.wait和Object.notifyAll来实现线程间的交互外,你还会经常使用哪些来实现?
为何ConcurrentHashMap能够在高并发的状况下比HashMap更为高效?
AtomicInteger、AtomicBoolean这些类之因此在高并发时高效,共同的缘由是?
请合理的使用Queue来实现一个高并发的生产/消费的场景,给些核心的代码片断。
请实现让10个任务同时并发启动,给些代码片断。
在Java程序运行阶段,能够用什么命令行工具来查看当前Java程序的一些启动参数值,例如Heap Size等。
用什么命令行工具能够查看运行的Java程序的GC情况,请具体写出命令行格式。
用什么工具,能够在Java程序运行的状况下跟踪某个方法的执行时间,请求参数信息等,并请解释下工具实现的原理。
当一个Java程序接收请求,很长时间都没响应的话,一般你会怎么去排查这种问题?
Java进程忽然消失了,你会怎么去排查这种问题?
如下这段代码思路,你以为在运行时可能会产生的风险是,应该如何改进?
public List<User> getUsers(String[] userIds){
// 从数据库查找符合userIds的user记录
// 将返回的记录组装为User对象,放入List并返回
}
如下两种代码,在运行时有什么不一样?为何?
第一种
private static final boolean isLoggerDebugEnabled = log.isDebugEnabled();
public void xx(User user){
if(isLoggerDebugEnabled){
log.debug("enter xx method, user id is: " + user.getId());
}
}
第二种
public void xx(User user){
log.debug("enter xx method, user id is: " + user.getId());
}
Java程序为何一般在刚启动的时候会执行的比较慢,而处理了一些请求后会变快,AOT能带来什么帮助?
Parallel GC、CMS GC、ZGC、Azul Pauseless GC最主要的不一样是?背后的原理也请简单描述下?
请写一段程序,让其运行时的表现为触发5次ygc,而后3次fgc,而后3次ygc,而后1次fgc,请给出代码以及启动参数。
Go的Coroutine和Java的线程机制最主要的不一样是?若是Java语言要透明的实现Coroutine,你以为主要的难点是?
一、BIO 有100个线程。BIO面向链接,一个链接一个线程,直接从流stream里读写。
NIO 能够只有1个处理线程。NIO面向缓冲区,读写操做的是缓冲区(buffer)。一个链接对应一个channel,不会直接从channel读写,数据都是经过缓冲区处理。
NIO有Selector,经过while循环检查或系统调用通知,检查多个channel的状态是否可读写,因此能够用单线程管理多个channel。
Java IO与NIO:https://juejin.im/post/5af79bcc51882542ad771546
Java NIO 之 Channel(通道):https://juejin.im/post/5af7f01b6fb9a07a9f01a339
二、2*cpu核数 左右
三、长链接创建后通常不会断开,也就是某个client会固定请求到某台server,随着扩容缩容、服务器上下线,会负载不均衡。
解决方法:
A、重启负载高的服务器
B、用短链接
C、不用LB
四、CGLIB经过字节码操做生成代理,能对类作代理。
JDK经过反射接口生成代理,因此被代理类必须有实现接口。
五、X
六、使用SynchronousQueue队列,不会缓存请求,可能致使线程数暴涨。
七、放到阻塞队列里
八、命名线程
九、阻塞队列、
十、ConcurrentHashMap 用分段锁,锁粒度更小
十一、使用CAS指令实现原子操做,不须要加锁
十二、阻塞队列
1三、略
1四、ps -ef | grep java
1五、jstat -gc pid 5000
1六、btrace、Arthas(只用过一次)
1七、先看线程
1八、查看操做系统/var/log/dmesg日志,一般是OOM致使被OS杀掉进程
1九、userIds数组过程,致使处理时间变成,消耗完全部IO线程,服务能力降为0。
措施:限制长度
20、第二种运行时会拼接字符串,对性能有影响
2一、刚启动是解释执行还要占用资源并采样镜像JTT编译,AOP在启动后提供最搞笑运行代码
2二、略
2三、略
2四、X