码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-02-04 00:07:19      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:解释执行   测试   速度   执行时间   程序   根据   count   面试题   一个   

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

阿里毕玄:来测试下你的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进程突然消失了,你会怎么去排查这种问题?

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

标签:解释执行   测试   速度   执行时间   程序   根据   count   面试题   一个   

原文地址:https://www.cnblogs.com/zhazhaacmer/p/12258102.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!