拆解面试-美团Java研发
本文约 1800 字,读完需要 7 分钟,速读仅需 4 分钟
1. 前言
这是日更面试经验以来,跟大家拆解的第 24 篇面经,今天分享一位中山大学22届学生的面试经验,同学于去年的八月下旬面试美团校招的java研发岗位 ,校招面试更加注重面试者的基础知识掌握与运用能力,同学都答上了但是还是很遗憾没有通过,本次面经分享包含大量后端知识,对大家入职后端开发岗位有比较大的帮助。
2. 求职者的面经自述
自我介绍
介绍项目
Http属于哪一层?Tcp和Udp属于哪一层?Tcp和Udp的区别和使用场景
简述输入一个网址到页面呈现内容的过程
进程和线程的区别
进程之间的通信方式
进程的调度策略
中断是什么?
死锁的条件?如何避免死锁?
mysql的索引用的是什么数据结构?B+树相对其他数据结构有什么好处?为什么树的高度越低查询效率越高?
Innodb事务隔离级别?幻读和脏读是什么?如何避免幻读?
SQL:一个表有学生id和分数两个字段,查询出分数高于90的学生个数
如何定位和优化慢查询?
索引建立的原则?
分表的方法?
栈和队列的区别?如何用两个栈实现队列?
说几个linux常用命令?如何查看一个文件?
CPU负载变高,如何定位问题?
HashMap内部如何实现?为什么线程不安全?
sleep和wait的区别?sleep在执行的时候需要获取锁吗?
JVM的内存分配策略?对象放在哪里?堆内部怎样划分?大对象放在哪里?
编程题:给定二维数组,按照主对角线输出元素
面试结果:凉透
3. 面经的复盘和建议
以上题目很偏基础,我们在对一些基础知识学习的时候,最好能结合一些实践操作,很多疑问不能一味的百度,要自己去尝试证明为什么会这样。
面试,将自己对于问题的思考和结论讲给面试官时,如果能带入自己对于这个面试题的过往实践、以及思考的过程,能让我们更容易讲明白,也能给面试官留下比较好的印象。毕竟面试官都不喜欢只会背面试题的求职者。
4. 涉及的高频问题以及答案
部分面试题答案引用自网络
(1)简述输入一个网址到页面呈现内容的过程
TCP/IP 链接建立起来后,浏览器向服务器发送HTTP请求;
服务器接收到这个请求,并根据路径参数映射到指定的处理器方法进行处理,获取数据以及视图等资源返回给浏览器;
浏览器解析并渲染视图,若有Js、CSS文件、图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
浏览器根据请求到的资源、数据渲染页面,最终呈现给用户。
(2)如何定位和优化慢查询?
1.如何定位并优化慢查询sql
a.根据慢日志定位慢查询sql
SHOW VARIABLES LIKE '%query%' 查询慢日志相关信息
slow_query_log 默认是off关闭的,使用时,需要改为on 打开
slow_query_log_file 记录的是慢日志的记录文件
long_query_time 默认是10S,每次执行的sql达到这个时长,就会被记录
SHOW STATUS LIKE '%slow_queries%' 查看慢查询状态
Slow_queries 记录的是慢查询数量 当有一条sql执行一次比较慢时,这个vlue就是1 (记录的是本次会话的慢sql条数)
注意: 如何打开慢查询 :SET GLOBAL slow_query_log = ON;
将默认时间改为1S:SET GLOBAL long_query_time = 1; (设置完需要重新连接数据库,PS:仅在这里改的话,当再次重启数据库服务时,所有设置又会自动恢复成默认值,永久改变需去my.ini中改)
b.使用explain等工具分析sql
在要执行的sql前加上explain 例如:EXPLAIN SELECT menu_name FROM t_sys_menu ORDER BY menu_id DESC;
接着看explain的关键字段
type:
如果发现type的值是最后两个中的其中一个时,证明语句需要优化了。
extra:
c.修改sql或者尽量让sql走索引
mysql查询优化器会根据具体情况自己判断走哪个索引,不一定是走主键(explain中的key可以看到走的哪个key)具体情况根据具体情况来定,当你要强制执行走某一个key时:
在查询的最后加上 force index(primary); 强制走主键的
(3)CPU负载变高,如何定位问题?
步骤如下:
1. 定位耗费cpu的进程
top -c,就可以显示进程列表,然后输入P,按照cpu使用率排序,你会看到类似下面的东西
2.定位耗费cpu的线程
top -Hp 13857,就是输入那个进程pid就好了,然后输入P,按照cpu使用率排序,你会看到类似下面的东西
大概类似上面那样,你就可以看到这个进程里的哪个线程耗费cpu最高
3.定位哪段代码导致的cpu过高
printf “%x\n” 16872,把线程pid转换成16进制,比如41e8
jstack 43987 | grep ‘0x41e8’ -C5 --color
这个就是用jstack打印进程的堆栈信息,而且通过grep那个线程的16进制的pid,找到那个线程相关的东西,这个时候就可以在打印出的代码里,看到是哪个类的哪个方法导致的这个cpu 100%的问题。
以上就是如何排查、定位、和解决cpu使用率100%的方法了。
5. 总结
各位未来的大佬,今天给各位汇报的面经拆解就到此结束了,还是那句话:点赞加分享是对笔者最大的认可,能给笔者带来不断更新的无穷动力。
祝各位早进大厂,拿高薪,娶富美!