刷面试题阿里毕玄:来测试下你的Java编程能力 - 题解 16-21
Posted zhazhaacmer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷面试题阿里毕玄:来测试下你的Java编程能力 - 题解 16-21相关的知识,希望对你有一定的参考价值。
原文链接 开发者社区> 面试一点通> 正文
【不懂】 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的主要内容,如果未能解决你的问题,请参考以下文章