盲点问题
✈️

盲点问题

Created
Jun 17, 2021 03:35 PM
Tags
Java

1. 年轻代里面的区域

新生代里面分为Eden区和SurvivorFrom (S0) 和 SurvivorTo (S1) 区, 分别占 8/10, 1/10, 1/10,  MinorGC的时候会先把Eden区活着的对象复制到S0区, 然后清空Eden区, 下一次会把Eden区和S0区活着的对象复制到S1区, (S0区和S1区是一样的作用, 用来相互复制), 如此反复15次, 还活着的对象就进入老年代.

2. 布隆过滤器

3. Spring事务隔离级别(应该是数据库的) 事物传播机制, 数据库引擎类型 数据库索引类型 B+Tree和BTree区别/B+Tree查找过程

4. ES选举/集群

Elasticsearch在满足如下时间点的时候会触发选举
  1. 集群启动初始化
  1. 集群的Master崩溃的时候
  1. 任何一个节点发现当前集群中的Master节点没有得到n/2 + 1节点认可的时候(防止脑裂),触发选举
Bully 算法: 简单暴力地通过选出 ID 最大的候选者来完成,ES 的选举与 Bully 算法有所出入,它选举的是ID 最小的节点

5. springMVC请求执行过程

执行流程

  1. 首先客户端发起用户请求,以http形式进入到servlet容器中,servlet容器解析http数据成为一个endpoint对象,endpoint对象包含了请求url、http header以及解析完或者读取完的body数据流。
  1. 然后进入用户自定义的filter,在filter中用户可以对request进行处理,然后经过多个filter处理完后,进入到dispatcherservlet,也就是springmvc的入口。
  1. 然后会先进入到一些常用的解析器中,比如用来解析上传文件的MultipartResolver,如果请求是Multipart,也就是说header包含Multipart,springmvc就会解析上传的请求里面的上传文件,解析成字节流,以及把一些字符串k、v读出来,封装到对象中以供后续的comtroller进行接收,从解析器出来后,就是根据请求url寻找handler(controller)的过程。
  1. 由于我们在controller方法中使用requestMapping注解定义了url映射,在启动过程中springmvc就会将controller及对应的方法注册到HandlerMapping中,如果无法在handlerMapping中找到请求对应的controller,就会报404错误。
  1. 找到controller后进入到HandlerInterceptor,即拦截器,在拦截器中可以进行打印日志,身份鉴权等操作。
  1. 经过拦截器后,springmvc会对数据进行绑定(与方法参数进行绑定),及数据验证,反射调用我们的controller方法,执行方法体中的业务逻辑,执行完成后创建ModelAndView。model就是数据,此时的view只是个viewName(String)。
  1. 如果我们定义了异常处理器,在拦截器处理数据绑定、数据验证、业务处理这些所有环节,只要出现了异常,都会被异常处理器拦截,可以在异常处理中返回相应的错误页面。
  1. 如果正常执行,会通过ViewResolver进行view的资源定位,找到view之后就会进入渲染页面的过程,实际是将数据进行模版的变量替换的过程,数据来源于request,modelMap,session中。
  1. 渲染之后就经过dispatcherservlet返回,再经过filter后续的处理,最终通过servlet容器形式http响应返回给客户端。
notion image
1. 客户端请求被DispatcherServlet(前端控制器)接收 2. DispatcherServlet请求HandlerMapping查询Handler 1. HandlerMapping根据请求URL查找Handler,将Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet 2. DispatcherServlet请求HandlerAdapter执行Handler 1. HandlerAdapter调用Handler的方法做业务逻辑处理 2. HandlerAdapter处理完Handler会生成一个ModelAndView对象 1. 将ModelAndView对象返回给DispatcherServlet 2. DispatcherServlet将获取的ModelAndView对象传给ViewResolver视图解析器,请求进行视图解析 1. ViewResolver将逻辑视图解析成物理视图View,返回给DispatcherServlet 2. DispatcherServlet根据View进行视图渲染(将模型数据填充到视图中) 1. DispatcherServlet将渲染后的视图响应给客户端

6. 如何判断链表有环

public Node detectCycle() { Node fast = this.head; Node slow = this.head; //循环退出两种情况: //1.fast.next == null(找到单链表结尾也没有找到环); 2.fast == slow(有环) while (fast.next != null) { fast = fast.next.next; slow = slow.next; if (fast == slow) { break; } } //链表没有环的情况 if (fast.next == null) { return null; } //链表有环, 把任意一个指针移动到head, 然后两个指针继续一步一步移动, 当相等的时候, 就是入环点 slow = this.head; while (fast != slow) { fast = fast.next; slow = slow.next; } return slow; }

7. HashMap是如何计算元素位置的

HashMap的初始容量和扩容都是以2的次方来进行的,那么length-1换算成二进制的话肯定所有位都为1,就比如2的3次方为8,length-1的二进制表示就是111, 而按位与计算的原则是两位同时为“1”,结果才为“1”,否则为“0”。所以h& (length-1)运算从数值上来讲其实等价于对length取模,也就是h%length。

8. 如何定位 java heap space OOM异常

可以使用Jmap得到当前java程序的内存分配的详细情况, 查看是什么对象导致的OOM
(警告: 生产环境慎用Jmap命令!)
notion image

9. 三色标记法

  • 白色:尚未访问过。
  • 黑色:本对象已访问过,而且本对象 引用到 的其他对象 也全部访问过了。
  • 灰色:本对象已访问过,但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后,会转换为黑色。
开始时, 所有对象都是白色, 然后把GC Roots对象标记为灰色, 然后访问它引用的对象, 当把它引用的对象访问之后, 把GC Root对象标记为黑色, 把它引用的对象标记为灰色, 然后继续沿着引用链往下访问.(这期间, 所有新生的对象都标记为黑色)

10. spring事物隔离级别(用的是数据库的数据隔离级别)

读未提交,读已提交,可重复读,序列化

11. 线程的生命周期状态

新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

12. 实现多线程的方式

继承Thread, 直接new Thread传入Runnable接口的实现类或者传入Callable接口的实现类

13. mysql有哪几种索引

1.普通索引
2.唯一索引
3.主键索引
4.组合索引
5.全文索引

14. vim断开连接继续编辑

15. 断点续传