vlambda博客
学习文章列表

拆解面试-美团Java研发

本文约 1800 字,读完需要 7 分钟,速读仅需 4 分钟


1. 前言

    这是日更面试经验以来,跟大家拆解的第 24 篇面经,天分享一位中山大学22届学生的面试经验,同学于去年的八月下旬面试美团校招的java研发岗位 ,校招面试更加注重面试者的基础知识掌握与运用能力,同学都答上了但是还是很遗憾没有通过,本次面经分享包含大量后端知识,对大家入职后端开发岗位有比较大的帮助。


2. 求职者的面经自述


   

  1. 自我介绍

  2. 介绍项目

  3. Http属于哪一层?Tcp和Udp属于哪一层?Tcp和Udp的区别和使用场景

  4. 简述输入一个网址到页面呈现内容的过程

  5. 进程和线程的区别

  6. 进程之间的通信方式

  7. 进程的调度策略

  8. 中断是什么?

  9. 死锁的条件?如何避免死锁?

  10. mysql的索引用的是什么数据结构?B+树相对其他数据结构有什么好处?为什么树的高度越低查询效率越高?

  11. Innodb事务隔离级别?幻读和脏读是什么?如何避免幻读?

  12. SQL:一个表有学生id和分数两个字段,查询出分数高于90的学生个数

  13. 如何定位和优化慢查询?

  14. 索引建立的原则?

  15. 分表的方法?

  16. 栈和队列的区别?如何用两个栈实现队列?

  17. 说几个linux常用命令?如何查看一个文件?

  18. CPU负载变高,如何定位问题?

  19. HashMap内部如何实现?为什么线程不安全?

  20. sleep和wait的区别?sleep在执行的时候需要获取锁吗?

  21. JVM的内存分配策略?对象放在哪里?堆内部怎样划分?大对象放在哪里?

  22. 编程题:给定二维数组,按照主对角线输出元素

    面试结果:凉透



3. 面经的复盘和建议


以上题目很偏基础,我们在对一些基础知识学习的时候,最好能结合一些实践操作,很多疑问不能一味的百度,要自己去尝试证明为什么会这样。

面试,将自己对于问题的思考和结论讲给面试官时,如果能带入自己对于这个面试题的过往实践、以及思考的过程,能让我们更容易讲明白,也能给面试官留下比较好的印象。毕竟面试官都不喜欢只会背面试题的求职者。




4. 涉及的高频问题以及答案

部分面试题答案引用自网络

(1)简述输入一个网址到页面呈现内容的过程

  1. TCP/IP 链接建立起来后,浏览器向服务器发送HTTP请求;

  2. 服务器接收到这个请求,并根据路径参数映射到指定的处理器方法进行处理,获取数据以及视图等资源返回给浏览器;

  3. 浏览器解析并渲染视图,若有Js、CSS文件、图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;

  4. 浏览器根据请求到的资源、数据渲染页面,最终呈现给用户。

(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%' 查看慢查询状态

      拆解面试-美团Java研发

      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;

      拆解面试-美团Java研发

      接着看explain的关键字段

  • type:

          拆解面试-美团Java研发

          如果发现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. 总结

    各位未来的大佬,今天给各位汇报的面经拆解就到此结束了,还是那句话:点赞加分享是对笔者最大的认可,能给笔者带来不断更新的无穷动力。

    祝各位早进大厂,拿高薪,娶富美!