个人总结常用面经

200 阅读10分钟

OSI网络七层模型

物理层:负责传输数据的物理介质,如光纤

数据链路层:提供点对点数据传输,将比特流转换为数据帧

网络层:处理分组在网络中的路由与转发,负责网络间的数据传输

会话层:建立、管理和终止会话(通信连接)

表示层:处理数据的方式,如压缩、格式转换

应用层:提供特定的应用程序功能,如发邮件、QQ

传输层:端到端的可靠数据传输以及数据修复,确保数据的可靠性和完整性

HTTP协议状态码:

200: 请求资源成功 301: 永久重定向 302: 临时重定向 400: 错误请求,服务器无法处理 401: 未授权 403: 禁止访问 404: 未找到资源 500: 服务器内部错误 502: 网关错误 503: 服务器维护

状态码详情
200请求资源成功
301永久重定向
302临时重定向
400错误请求,服务器无法处理
401未授权
403禁止访问
404未找到资源
500服务器内部错误
502网关错误
503服务器维护

进程、线程、协程的区别:

进程是系统资源调度的最小单位,线程是进程中较小的执行单位,协程是用户级别的,轻量级,实现任务切换和高并发处理

linux 查看系统占用情况命令:

top:查看系统资源使用情况

htop: top的增强版本提供了更多的交互式功能和更直观的界面

free:查看系统内存使用情况

df:查看磁盘使用情况

ps:查看进程信息

ACID:

A:原子性,数据库事务要么全部提交,要么全部回滚,不会出现只提交一半的情况

C:一致性,数据库在各种操作和并发访问下,始终保证数据的正确性和完整性,并不会因为系统故障而导致数据损坏

I:隔离性,事务与事务之间是相互独立的,互不影响,添加事务不会影响查找操作,避免出现脏读、幻读的情况

D:持久性,在事务提交成功后,数据就会存入磁盘当中,不会因为系统崩溃而导致数据消失。

MVCC:

高并发控制工具,使用时间戳去维护版本的生命周期,在进行写入操作时,生成新的版本并覆盖,在进行查询时访问上一次的版本

TCP的粘包和拆包是怎么设计的,如果让你去设计你会怎么去做?

TCP的粘包意思就是多个数据包变成一个数据包进行传输,拆包就是一个数据包变成多个数据包进行传输,设计粘包和拆包有三种情况:

1、使用固定长度的方式,在发送和接收双方都统一使用固定的长度去进行粘包和拆包。

2、使用分隔符的方式,比如\n在接收方进行数据解析时,遇见\n就知道是下一个数据的出现

3、使用消息头的方式,可以在消息的头部插入数据长度、数据类型、数据大小等信息,可以更灵活的进行数据的粘包与拆包

介绍一下红黑树

1、红黑树的根节点和叶子节点都必须为黑色

2、红色节点的子节点必须是黑色

3、每个节点的子孙节点路径上的黑色节点数量相等

java集合中使用红黑树的有TreeMap、TreeSet等

如何解决哈希冲突?

1、使用哈希里面放入链表的方式,在遇见相同哈希值时,将数据存入链表的末尾

2、开放寻址,在哈希表中找另一个空的位置来存储哈希冲突的键值对

3、双重哈希,哈希计算两次,更大程度避免了哈希冲突

4、建立更好的哈希函数减少哈希冲突

什么原因会造成I/O阻塞,如何解决?

1、网络延迟,网络延迟导致读写数据有延迟导致阻塞

2、写入文件过大

3、设备未响应,比如使用打印机,打印机不响应,这条线程就会卡着。

4、文件锁定,没有权限或文件被其他文件使用,导致其他线程被锁住

5、同步操作,该操作必须得等待上一步操作完成后才能执行。

解决: 1、拥有良好的网络环境

2、多线程进行写入操作,避免单线程阻塞系统运行

3、及时的进行处理,避免未响应的情况出现

4、使用异步I/O,等待拥有使用权的时候,得到通知再去使用在等待过程中就是空闲状态,避免阻塞。

5、使用缓存区,减少底层I/O次数

如何解决网络连接的安全性?可靠性?

安全性: 使用签名认证,身份验证和授权,确保连接是合法的

使用加密的通讯协议

记录详细的日志,便以及时响应安全事件

可靠性: 重试和超时策略,在网络传输超时时,可以有超时重传和断开连接等策略,进行适当的错误处理和恢复

冗余和负载均衡,使用负载均衡,将压力分摊给多个网络节点,避免单个服务器压力过高的情况

容灾备份,保证主网络节点出问题后,有其他备份代替。

对象实例化的过程?

类加载器:将所使用的代码块解析为字节码并载入内存中

设置对象头:对象头中含有GC分代年龄、锁状态、锁标记

初始化零值:将对象赋为0或null值

执行构造方法:执行构造方法

对象引用:

--GC分代年龄:分为新生代、老年代、永久代、元空间

分代年龄的阙值一般是15,分代年龄指的是对象经过多少次垃圾回收处理,经过15次垃圾回收处理后,还存活就将晋升为老年代,新生代一般生存周期低,使用minor GC算法进行清理,老年代使用majar GC算法进行清理需要消耗更多的时间

JVM:类加载器 运行时数据区、内存分区、执行引擎、本地接口 --运行时数据区:堆、方法区、虚拟机栈、本地方法栈、程序计数器

TCP与UDP 两种协议的区别:

1、连接性:TCP(有连接)在通信前需要建立连接,UDP(无连接)不需要

2、可靠性:TCP提供可靠的连接,它可以通过序号、确认应答、重传机制来保证数据的正确性,UDP不提供可靠性保证,数据可能乱序,与发送者的数据不一致、丢失。

3、有序性:TCP提供的数据是有序的,确保接收方接收的数据按提供方发给出的数据顺序一致。

4、消息大小:TCP在消息大小方面控制的是1500MTU,UDP不做控制

5、拥塞控制:TCP具有拥塞控制操作,根据网络环境的状况动态的去调整,UDP是进行固定的传输

6、应用场景:TCP用于对可靠性和有序性较高的场景比如:电子邮件,UDP 用于对实时性较高的场景,比如,视频对话

--使用UDP实现TCP可以在应用层,实现分段、确认、重传、拥塞控制的操作,但是不具有高效性和可靠性,还很复杂。

索引是什么?

  1. 索引是帮助高效查询数据库中数据的数据结构
  2. 索引存储在文件系统中
  3. 索引的存储形式与存储引擎有关
  4. 索引的存储结构有:hash、b树、b+树、二叉树

为什么在InnoDB数据库中使用B+树

  1. hash是存储在内存中的,在企业中数据量比较大,存储内存造成浪费
  2. 红黑树会因为树的高度过高,导致查询效率变慢
  3. b树在数据量不是特别大的时候可以使用,当数据量变大,树的高度也会随之变高
  4. hash一般用于等值查找,在企业中范围查找的情况比较多。

B树和B+树的区别:

1、B树每个子节点都存储着键和数据 2、B+树只有叶子节点存储键和数据,而且节点用指针指向,形成链表,构成有序链表

B+树的优势:

1、只有叶子节点存储数据,可以有更多的容纳量

2、叶子节点用指针连接,构成链表,顺序查询效率高

InnoDB和MyISAM是如何读取索引的

1、InnoDB是通过索引文件进行索引查找,根据查询条件从B+树中进行查询,找到叶子节点,叶子节点的键连接着值,读取索引的同时也读取到了键

2、MyISAM是通过索引文件查找出索引,然后通过索引去数据文件中找到对应的数据行。

索引的分类

1、主键索引:主键,一般自动生成

2、唯一索引:全字段唯一,不能出现相同值

3、普通索引:没有约束条件,可以为空

4、全文索引:一般用于字符串

5、联合索引:多列值组成一个索引,一般用来联合查询

聚簇索引和非聚簇索引的区别:

1、聚簇索引适用于大量增删改操作,支持事务、表锁、行锁、外键、全文索引

2、非聚簇索引适合大量查询操作,全都不支持

Java中有哪些集合?

Java中的集合主要是由collection和map的派生构成的,Collection派生出,set、list、queue三个接口,map的所有集合都是这四个接口的实现类,如HashMap,HashSet,TreeMap,ArrayList,ArrayDequeue,LinkedList等。

讲一下锁:

分为乐观锁、悲观锁 乐观锁是在高并发情况下,读操作不会与其他操作所冲突,使用一个时间戳去进行版本维护,确保在读取数据和写入数据之间没有其他线程修改资源 ,如果通过则使用新的时间戳去更新,如果不通过则表示被修改,通常会重试或者放弃。 适用于读高并发,写入操作较少环境下,不会立即加锁,不会占用太多的资源,提高系统性能、吞吐量。

悲观锁是在高并发情况下,读和写操作下,其他线程随时可能修改资源,因此在读取资源的时候会立即加锁,避免其他线程干扰,悲观锁通常会阻塞其他线程的操作,直到当前操作完成释放锁。 悲观锁适用于写高并发,读操作较少的环境,读入数据立马加锁,避免数据修改风险,不过会引起资源竞争,降低系统吞吐量。