疏漏总结(十一)

  1. 什么是Java的快速失败和安全失败?

快速失败:两个线程,A去读一个集合的内容,B去update相同集合的内容,会报ConcurrentModificationException。
原因是:集合框架内部针对每个元素有一个modCount,如果元素的值改变,modCount也会改变,如果我们使用hashNext()/next()遍历到了modCount改变的元素(每次迭代都会先比较是否为自己心仪的modCount),就会报错。

安全失败:拷贝原集合,然后再迭代。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,CopyOnWriteArrayList就是这个道理(JUC下全部为安全失败)

  1. time_wait和close_wait

TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。 由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接。

CLOSE_WAIT是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。

  1. cms执行的过程

3.1 初始标记(stop the world):该阶段进行可达性分析,标记GC ROOT能直接关联到的对象。

3.2 并发标记:该阶段进行GC ROOT TRACING,在第一个阶段被暂停的线程重新开始运行。由前阶段标记过的对象出发,所有可到达的对象都在本阶段中标记。

3.3 并发预清理:此阶段标记从新生代晋升的对象、新分配到老年代的对象以及在并发阶段被修改了的对象。

3.4 重标记(stop the world):暂停所有用户线程,重新扫描堆中的对象,进行可达性分析,标记活着的对象。有了前面的基础,这个阶段的工作量被大大减轻,停顿时间因此也会减少。注意这个阶段是多线程的。

3.5 并发清理:用户线程被重新激活,同时清理那些无效的对象。

3.6 重置:CMS清除内部状态,为下次回收做准备。

  1. HashMap总结点达到64且长度到8变成红黑树

  2. finalize

首先,大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。

  1. epoll与select模型

select的效率低于epoll,因为它需要大量拷贝fd_set,并且需要不断遍历监听列表,而epoll这种基于响应事件的方式明显会更具优势。

调用epoll_create时,做了以下事情:

内核帮我们在epoll文件系统里建了个file结点;
在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket;
建立一个list链表,用于存储准备就绪的事件。

调用epoll_ctl时,做了以下事情:

把socket放到epoll文件系统里file对象对应的红黑树上;
给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪list链表里。

调用epoll_wait时,做了以下事情:

观察list链表里有没有数据。有数据就返回,没有数据就sleep,等到timeout时间到后即使链表没数据也返回。而且,通常情况下即使我们要监控百万计的句柄,大多一次也只返回很少量的准备就绪句柄而已,所以,epoll_wait仅需要从内核态copy少量的句柄到用户态而已。

同时监听多个socket的。假设我们需要监听的读套接字read[],它作为参数传递进了select函数。

select(fd_set read[],fd_set [],fd_set [],timeout)

1.从用户空间拷贝fd_set到内核空间,也即从当前程序拷贝fd_set数组进内核,fd_set是什么可以参考百度百科,简单的说,是可以对socket进行操作的long型数组。

2.对所有的fd进行一次poll操作,即把当前进程挂载到fd上。

3.poll操作过程中select会唤醒所有的队列中节点,进行遍历,得到它们的掩码(不同的掩码表示不同的就绪状态)。

4.如果所有设备返回的掩码都没有显示任何的事件触发,就去掉回调函数的函数指针,进入有限时的睡眠状态,再恢复和不断做poll,再作有限时的睡眠,直到其中一个设备有事件触发为止。

5.只要有事件触发,系统调用返回,将fd_set从内核空间拷贝到用户空间,回到用户态,用户就可以对相关的fd作进一步的读或者写操作了。

  1. b+ b

1.B+树的非叶子节点不记录数据本身,只记录引用的连接,并且结点中仅含有其子树中的最大(或最小)关键字。基于此特点,B+树在非叶子节点的文件会非常小;

2.B+树的所有的叶子结点中包含了全部关键字的信息;

3.B+树的每个叶子节点都有指向相邻的下一个兄弟叶子节点的指针且叶子结点本身依关键字的大小自小而大顺序链接。基于此特点,B+树在范围查询上的效率比B树高了很多;

4.这条区别是有争议的,有人说B+树的节点中关键字和子节点个数相同,也有人说B+树和B树一样关键字比子节点少一个。

  1. SpringMVC执行的过程

1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。

  1. 如何进行TCP拥塞控制的

拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章