最近一直在面试遇到很多问题,总结一下
1.HashMap
HashMap是非线程安全的,HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。
HashMap并可以接受 null(HashMap 可以接受为 null 的键值 (key) 和值 (value),HashMap 比较快,因为是使用唯一的键来获取对象。
HashMap 基于 hashing 原理,我们通过 put() 和 get() 方法储存和获取对象。当我们将键值对传递给 put() 方法时,它调用键对象的 hashCode() 方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时,通过键对象的 equals() 方法找到正确的键值对,然后返回值对象。HashMap 使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap 在每个链表节点中储存键值对对象。
2.用户反映你开发的网站访问很慢可能会是什么原因,如何排查
1.服务器出口带宽不够用。
2.服务器负载过大忙不过来,比如说CPU和内存消耗完了
3.网站的开发代码没写好,如mysql语句没有进行优化,导致数据库的读写相当耗费时间
4.数据库的瓶颈,也是很常见的一个瓶颈
排查
(1)某个用户反馈网站访问变慢,怎么去定位问题。首先你自己也打开下网站,看是否会出现用户反映的问题,如果你这边访问没问题,那就可能是用户那边的问题了,这块就是要先确定是用户那一方的问题还是自身比如说服务器或者网站的问题。
(2)发现确实是自己服务器或者网站的问题,那么可以利用浏览器的调试功能(一般浏览器都会有)。
(3)然后针对服务器的负载情况,可以去查看下服务器硬件(网络带宽、CPU、内存)的消耗状况。带宽方面查看流量监控看是不是已经到了峰值,带宽不够用了,如果是公司自己买服务器搭的网站服务器的话,需要自己搭建监控环境;如果用的是阿里云腾讯云这些的,那这些平台那边会提供各方面的监控比如CPU、带宽等等,在后台就可以看到了。
(4)如果发现硬件资源消耗都不高,都比较充裕,那要去看看是不是程序的问题了。这个可以通过查日志来找,比如Apache日志、mysql日志等等的错误日志,特别如mysql有个慢查询的日志功能,可以看到是不是某条mysql语句特别慢,如果某条语句花的时间太长,那这条语句很有可能有问题。
(5)至于说到的数据库太庞大,这个直接看就看得到了,比如一个表的文件大小变得特别大了。
3.springMVC执行流程,常用注解及作用
-
在接收到 HTTP 请求后,DispatcherServlet 会查询 HandlerMapping 以调用相应的 Controller。
-
Controller 接受请求并根据使用的 GET 或 POST 方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给 DispatcherServlet。
-
DispatcherServlet 将从 ViewResolver 获取请求的定义视图。
-
当视图完成,DispatcherServlet 将模型数据传递到最终的视图,并在浏览器上呈现。
所有上述组件,即: HandlerMapping,Controller 和 ViewResolver 是 WebApplicationContext 的一部分,它是普通 ApplicationContext 的扩展,带有 Web 应用程序所需的一些额外功能。
4.springMVC常用注解
@Controller
@Controller 标记一个类是Controller
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
@ModelAttribute和 @SessionAttributes
使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
5.java8的新特性
如
List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 == 0) { evens.add(num); } }
利用流式处理
List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
函数式接口(Functional Interface)是只包含一个方法的抽象接口。
6.画个架构
nginx将请求转发到服务端,服务端直接去zk上去取kafka,然后进行连接
//kafka到zk上去注册,直接连接到zk,zk和kafka之间相互交互,服务端不会直接跟kafka直接交互
2.服务器直接去连接文件服务器集群,直接去取直接去返回 server<--->文件服务器
3.服务器直接去连接mysql集群
//也有的公司,MySQL去zk上注册,应用服务直接去zk里面取到生效的mysql,然后去MySQL集群里面取mysql(相当于zk在管理MySQL的集群)
4.服务器直接去连接redis 直接去取,直接去返回 server<--->redis
//也有的公司,redis去zk上注册,应用服务直接去zk里面取到生效的缓存,然后去redis集群里面取信息(相当于zk在管理redis的集群)
5.cdn:不属于服务的架构之内,有的公司会去租用阿里云等的cdn,主要用于 前端 的访问策略,是在自己的服务之外的
7.MySQL监控工具
Spotlight on mysql客户端工具,有漂亮的ui界面,可以监控到mysql的io、qcache、连接数、buffer pool等等,还有预警的功能
Lepus,一个开源的国产监控平台,可以监控到mysql的慢查询、 qcache、连接数、buffer pool等等,可以同时监控多台,配置多个实例即可
Zabbix,也是一个开源的监控平台,和lepus类似,配置比较复杂