zoukankan      html  css  js  c++  java
  • 来测试下你的Java编程能力

    上篇整理了下后面准备更系统化写的Java编程进阶的思路,如果仅看里面的词,很多同学会觉得都懂,但我真心觉得没有多少人是真懂的,所以简单的想了一些题目,感兴趣的同学们可以来做做看,看看自己的Java编程水平怎么样。

    懒得去做小程序了,所以大家就直接回复你的答案吧,我会来一一点评下,友情提醒下,有些题目有点坑。

    1. 基于BIO实现的Server端,当建立了100个连接时,会有多少个线程?如果基于NIO,又会是多少个线程? 为什么?

    2. 通常来说基于NIO实现的Server端,会用多少个线程去处理IO事件,为什么?

    3. 一个典型的客户端集群->LB->服务端集群这样的结构中,如客户端采用连接池,长连接的方式,这种设计你觉得可能会出现什么问题?如果客户端采用的是单个长连接的方式呢?如果有问题,你觉得应该怎么解决?

    4. cglib和Java的动态代理相比,具体有什么不同?

    5. 在基于Netty实现FrameDecoder时,下面两种代码的表现会有什么不同?

      第一种

      private void callDecode(...) {

             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);

      }

    6. 用Executors.newCachedThreadPool创建的线程池,在运行的过程中有可能产生的风险是?

    7. new ThreadPoolExecutor(10,100,10,TimeUnit.MILLISECONDS,new LinkedBlockingQueue(10));一个这样创建的线程池,当已经有10个任务在运行时,第11个任务提交到此线程池执行的时候会发生什么,为什么?

    8. 实现一个自定义的ThreadFactory的作用通常是?

    9. 除了用Object.wait和Object.notifyAll来实现线程间的交互外,你还会常用哪些来实现?

    10. 为什么ConcurrentHashMap可以在高并发的情况下比HashMap更为高效?

    11. AtomicInteger、AtomicBoolean这些类之所以在高并发时高效,共同的原因是?

    12. 请合理的使用Queue来实现一个高并发的生产/消费的场景,给些核心的代码片段。

    13. 请实现让10个任务同时并发启动,给些代码片段。

    14. 在Java程序运行阶段,可以用什么命令行工具来查看当前Java程序的一些启动参数值,例如Heap Size等。

    15. 用什么命令行工具可以查看运行的Java程序的GC状况,请具体写出命令行格式。

    16. 用什么工具,可以在Java程序运行的情况下跟踪某个方法的执行时间,请求参数信息等,并请解释下工具实现的原理。

    17. 当一个Java程序接收请求,很长时间都没响应的话,通常你会怎么去排查这种问题?

    18. Java进程突然消失了,你会怎么去排查这种问题?

    19. 以下这段代码思路,你觉得在运行时可能会产生的风险是,应该如何改进?

      public List<User> getUsers(String[] userIds){

             // 从数据库查找符合userIds的user记录

            //  将返回的记录组装为User对象,放入List并返回

      }

    20. 以下两种代码,在运行时有什么不同?为什么?

      第一种

      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());

      }

    21. Java程序为什么通常在刚启动的时候会执行的比较慢,而处理了一些请求后会变快,AOT能带来什么帮助?

    22. Parallel GC、CMS GC、ZGC、Azul Pauseless GC最主要的不同是?背后的原理也请简单描述下?

    23. 请写一段程序,让其运行时的表现为触发5次ygc,然后3次fgc,然后3次ygc,然后1次fgc,请给出代码以及启动参数。

    24. Go的Coroutine和Java的线程机制最主要的不同是?如果Java语言要透明的实现Coroutine,你觉得主要的难点是?

    Answer

    1、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、2*cpu核数 左右

    3、长连接建立后一般不会断开,也就是某个client会固定请求到某台server,随着扩容缩容、服务器上下线,会负载不均衡。

    解决方法:

    A、重启负载高的服务器

    B、用短连接

    C、不用LB

    4、CGLIB通过字节码操作生成代理,能对类做代理。

    JDK通过反射接口生成代理,所以被代理类必须有实现接口。

    5、X

    6、使用SynchronousQueue队列,不会缓存请求,可能导致线程数暴涨。

    7、放到阻塞队列里

    8、命名线程

    9、阻塞队列、

    10、ConcurrentHashMap 用分段锁,锁粒度更小

    11、使用CAS指令实现原子操作,不需要加锁

    12、阻塞队列

    13、略

    14、ps -ef | grep java

    15、jstat -gc pid 5000

    16、btrace、Arthas(只用过一次)

    17、先看线程

    18、查看操作系统/var/log/dmesg日志,通常是OOM导致被OS杀掉进程

    19、userIds数组过程,导致处理时间变成,消耗完所有IO线程,服务能力降为0。

    措施:限制长度

    20、第二种运行时会拼接字符串,对性能有影响

    21、刚启动是解释执行还要占用资源并采样镜像JTT编译,AOP在启动后提供最搞笑运行代码

    22、略

    23、略

    24、X

  • 相关阅读:
    Git 常用命令速查表
    Android的Fragment中onActivityResult不被调用
    git基本操作
    Android混淆
    Shell
    小米手机图标应用图标不改变的问题
    linux常用基本命令
    android新建的项目界面上没有显示怎么办?
    bzoj5249: [2018多省省队联测]IIIDX(线段树)
    bzoj1951: [Sdoi2010]古代猪文(Lucas+CRT+欧拉定理)
  • 原文地址:https://www.cnblogs.com/549294286/p/10451394.html
Copyright © 2011-2022 走看看