2021/01/26背题笔记

  • 计算机网络

    • OSI七层模型,挑选几层解释一下

      • 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

    • 能不能详细解释一下TCP三次握手四次挥手的过程以及原因,为什么一定要三次握手,四次挥手

      (三次握手)

      • 服务器处于监听状态,TCP客户端发送数据请求,SYN=1,seq=x

      • 服务器接收到之后,发出确认报文,ACK=1,SYN=1,确认号ack=x+1,同时发送一个seq=y

      • 客户端收到后,发出确认报文,ACK=1,ack=y+1,自己的序列号seq=x+1

      • 当服务器接收到之后,三次握手就正式完成了

      (四次挥手)

      • 客户端发送FIN=1,seq=u,

      • 服务器接收后,发送ACK=1,ack=u+1,seq=v

      • 服务器发送FIN=1,seq=w,ACK=1,ack=u+1

      • 客户端返回ACK=1,seq=u+1,ack=w+1

    3、为什么要四次挥手三次握手,为什么多了一次

    • 其实三次握手也是四次握手,不过他在中间的那一段,把确认和同步这两个信息合并了,之所以这样是因为建立连接的时候不需要等待数据传输完成,而在释放连接的时候,客户端停止向服务端发送数据后,服务端可能还有数据要发送给客户端,所以中间分开了,等待服务端数据传输完成,在发送了一次服务端的关闭请求

    4、GET,POST,UPDATE,delete哪一个是幂等的,能不能讲解一下

    • get获取资源不会进行修改,update对资源更新,多次修改仍然不变,delete删除后会返回空,依旧幂等,post不幂等,会不断新加资源

    5、你经常使用的Linux命令

    • ps -ef|grep programname

    • mkdir /a/b/c -p

    • rm -rf

    • shutdown -r now

    • kill -9 PID

    • rpm -qa |grep filename

    • cat

    • vim

    6、你是如何理解Linux的启动过程的,如果我们使用SSH链接服务器,服务器断开之后能否会话能否继续执行,不能,如何解决,tmux

    • 关于linux系统的启动流程可以分为以下步骤:

      POST(加电自检)–>加载BIOS(Basic Input/Outpu System)–>确定启动设备(Boot sequence)、加载Boot Loader–>加载内核(kernel)初始化initrd–>运行/sbin/init初始化系统–>打印用户登录提示符

    • tmux https://www.ruanyifeng.com/blog/2019/10/tmux.html

      • 会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。

        一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。

        为了解决这个问题,会话与窗口可以"解绑":窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话"绑定"其他窗口。

  • 操作系统 1、简单介绍一下进程和线程

    • 系统调用的基本单位和CPU调度的基本单位

    2、进程和线程的区别

    • 进程下细分为多个线程,一个程序跑起来就是一个进程,

  • 数据库 1、MySql的事务隔离级别

    • 读未提交(脏读,不可重复读,幻读),读提交(不可重复读,幻读),可重复读(Innodb默认级别,幻读),串行化

    2、可重复读和已提交读的区别

    3、Mysql中的不同join链接的一个问题

    4、不同的事务隔离级别他们分别如何实现

    • RC-读取不加锁,数据写入,修改,删除需要加锁

    • RR-类似于排了一个快照,原理是采用记录事务id,然后通过undo log来找寻到id对应的状态

    5、最左前缀

    • 联合索引是遵循最左前缀匹配原则

    6、为什么使用联合索引?

    • 减少开销:一个联合索引(a,b,c)相当于创建了(a),(a,b)(a,b,c)三个索引

    • 覆盖索引:不用建立繁多的覆盖索引

    6、有没有遇到过慢SQL如何进行解决,怎么进行优化

    • 如果是偶尔执行很慢,可能是数据库再刷新脏页,或者遇到了锁

    • 如果是一直很慢,没有用上索引,选错了索引,语句用了*

    7、索引的数据结构

    b+树,为什么不是b树,b+树数据下沉全在最后叶子节点,查询稳定,叶子节点有指针相连也更适合范围查询,但是b树也不是毫无作用,显然单一数据查询性能更优秀,mongodb用的就是b树

  • Java基础 1、HashMap的底层如何进行实现的

    • 1.7数组+链表,头插法1.8数组+链表+红黑树,尾插法

    2、ArrayList和LinkedList如何实现

    • 数组初始容量10,扩容增量1.5,链表

    3、双亲委派模型

    • 首先,判断两个类是否相等,最基础的就是应该一个类加载器加载

    • (启动类加载器)bootstrap-(扩展类加载器)extension-应用类加载器(application)

    • 如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个请求(他的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

    • 如果没有使用双亲委派模型,由各个类加载器自行加载的话,如果用户自己编写了一个称为java.lang.Object的类,并放在程序的ClassPath中,那系统将会出现多个不同的Object类, Java类型体系中最基础的行为就无法保证。应用程序也将会变得一片混乱。

    4、Tomcat中的双亲委派模型

    • common类加载器->webapp类加载器->jsp类加载器

    5、打破双亲委派模型的原因,双亲委派模型的意义

    • 为了实现隔离性,每个项目加载自己的class文件,不会传递给父类加载器

    6、GC算法

    • 标记清除,标记整理,复制算法

    7、可达性分析,引用计数

    • 会出现a<->b循环引用删除不掉的问题

    • 以一个root作为根,可达即存活

    8、CMS和G1的区别

    • 初始标记,并发标记,重新标记,并发清除

    • 初始标记,并发标记,最终标记,筛选回收

    • g1可预测的停顿时间模型,会根据region价值进行回收

    9、JMM,CMS作用范围

    • JMM是java内存模型,就是线程在主内存中有共享变量

    • 与serial,parnew组合,自身处理老年代

    10、StopTheWorld如何解决

    • 垃圾回收算法的选择,现在都是多核,尽量使用并行的垃圾回收算法

    • 堆不要设计的过大

    • 无用对象尽早释放

    11、标记清除会产生内存碎片,标记整理和标记清除的区别

    • 标记清除标记无用的,直接清掉

    • 标记整理,标记存活的,进行移动

    • 浮动垃圾就是下次的时候清除掉,或者

    12、安全点

    • 安全点就是指,当线程运行到这类位置时,堆对象状态是确定一致的,JVM可以安全地进行操作,如GC,偏向锁解除等。

    13、分代的优点

    • 年轻代相对复制算法,改善了吞吐量,解决了碎片问题

    • 老年代使用标记整理算法

  • 线程 1、线程状态

    • 初始,运行,阻塞,等待,超时等待(时间一到自动返回),死亡

    2、sleep()方法进入什么状态

    • 阻塞

    3、Synchronzied的工作原理

    • monitor-enter,monitor-exit(对象,代码块),acc_synchronzied(方法)

    4、CAS的一个引用场景

    5、如何解决ABA

    • 时间戳

  • Spring 1、Spring IOC

    • IOC全称是控制反转,就是把原先在程序中手动创建对象的权限交给了IOC容器,这样我们在用的时候直接拿就可以,IOC容器实际上就是个map,value中存储的是各种对象,讲对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入,可以很大程度上简化应用的开发,IOC容器就像一个工程一样,当我们需要创建这个对象的时候,只需要配置好注解,完全不用考虑对象是如何被创建出来的,

    2、Spring AOP

    • AoP是面向切面编程,他将那些与事务无关,但是是各个事务之间的逻辑的公共部分封装起来,减少重复代码,降低耦合

    3、Spring解决循环依赖

    • Spring是通过递归的方式获取目标bean及其所依赖的bean的;

    • Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。

    结合这两点,也就是说,Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。

    不用构造器注入用setter注入就算过

    4、Spring 的代理方式,cglib和Java自带的一个区别

    • AOP基于动态代理,如果要代理的对象有接口,那么就是用JDKproxy,如果没有接口Spring AOP会通过Cglib创建一个子类进行代理,当然也可以使用AspectJ来进行代理,现在的Spring AOP已经继承了AspectJ,Spring AOP属于运行时增强,AspectJ属于编译时增强,Spring AOP基于代理,Aspect基于字节码操作,如果切面较多,建议使用AspectJ,更快

    5、静态代理和动态代理的区别,各自的优点和缺点。

    https://segmentfault.com/a/1190000011291179

    • 静态代理在编译时产生class字节码文件,可以直接使用,效率高。

    • 动态代理必须实现InvocationHandler接口,通过反射代理方法,比较消耗系统性能,但可以减少代理类的数量,使用更灵活。

    • cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类。

    •  

 

 

 

 

 

 

 

 

 

posted @ 2021-01-26 21:06  crud-boy  阅读(36)  评论(0)    收藏  举报