【刷面试题】阿里毕玄:来测试下你的Java编程能力 - 题解 16-21

原文链接 开发者社区> 面试一点通> 正文

阿里毕玄:来测试下你的Java编程能力

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

btrace,Arthas,主要借助JVM attach agent,ASM以及Instrumentation来动态的替换字节码,从而实现动态的对程序运行情况的跟踪。 -- http://www.sohu.com/a/298857998_494946

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

  • 看状态码,初步判断是前端问题还是500的后端问题
  • 确定是500的话,服务还正常,JPS找到对应java进程pid,jstack一把找出运行的线程信息,找出对应的卡点信息
  • 或者查看日志,看运行到哪里不动了,尝试本地复现,bugfix

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

  • 内存里是没东西的,查看日志信息
  • 尝试本地复现
  • 查看操作系统/var/log/dmesg日志,通常是OOM(内存溢出)导致被OS杀掉进程 --https://blog.csdn.net/weixin_33859231/article/details/93757163
  • 查看运维系统的一些操作日志

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

List getUsers(String[] userIds){

   // 从数据库查找符合userIds的user记录
  //  将返回的记录组装为User对象,放入List并返回
}
  • 很正常啊,没问题啊!
  • 仔细想想,数据量大的话,常见的表会有几十万-几百万行数据,直接OOM!
  • 没有分页!这么简单!

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());
}
  • 貌似还是差不多
  • 再看看, isLoggerDebugEnabled 是static,在编译期会取到结果,上面的代码可能永远不会执行一次,当isLoggerDebugEnabled = false的时候,在编译期会会kill掉
  • 下面的代码不会.

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

  • Java程序先慢后快: 刚启动的时候Java还处于解释执行阶段,处理了一些请求后随着C1、C2编译的介入,会优化为机器码,并且借助各种运行时数据的高级优化,使得Java程序逐渐进入一个高速运行的状态 [没想过,这还是Java吗?]
  • AOT (Ahead-Of-Time - 预先编译,事先生成机器码,) 详见https://www.zhihu.com/question/23874627

-JIT:吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制

  • AOT:内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化

你可能感兴趣的:(【刷面试题】阿里毕玄:来测试下你的Java编程能力 - 题解 16-21)