面试面经汇总
第一
-
进程与线程的区别
- 进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元
- 一个进程可以有很多线程
- 每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。
-
PCB的结构
- 进程状态
- 标识符
- 进程调度信息
- 程序计数器
- 上下文数据
-
分页和分段的区别
- 段向用户提供二维地址空间;页向用户提供的是一维地址空间
- 的大小固定且由系统决定,而段的长度却不固定,由其所完成的功能决定
- 段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制
-
怎么避免死锁(死锁预防)
资源有序分配法
-
处理死锁的四种方法
预防、避免、检测
-
UDP如何借鉴TCP的性质实现一个TUDP?
1.握手;2.超时重传(SEQ、ACK)
-
快排最糟糕的情况
O(n^2)
-
红黑树的五大特征
- 每个节点是红色或者黑色
- 根节点是黑色
- 叶子节点是红色
- 红色节点的子节点是黑色(没有相邻的红色节点)
- 每个节点到叶子节点的简单路径的黑色节点数相同
-
JVM 如何判断对象是否存活
引用链法
-
垃圾回收算法
- 标记清除算法
- 复制算法
- 标记整理算法
- 分代算法
- 新生代(复制算法)
- 老年代(标记整理算法)
-
hashtable与HashMap
线程安全、key/value能否为空
-
HashMap 1.8 前后区别
- 红黑树
- 先插入再扩容
-
ConcurrentHashMap 1.8 前后区别
分段锁、synchronized与CAS
第二
-
负载均衡的原理
通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求
-
nginx 可以做几层的负载均衡?
传输层、应用层
-
四层和七层的负载均衡的区别?
- 四层负载均衡仅能转发 TCP/IP 协议、UDP 协议、通常用来转发端口,如:TCP/22、udp/53
- 四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用 65535 个端口号)
- 四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同事的使用)
- 四层的转发效率比七层的高得多,但仅支持 TCP/IP 协议,不支持 HTTP 和 HTTPS 协议
- 通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡
- 七层负载均衡会终止网络流量并读取器中消息,它可以根据消息内容(如 URL 或 cookie)做出负载均衡决策
-
nginx 单点失效怎么办?
keepalived高可用
-
sql 与 nosql 区别
关系型与非关系型
-
关系型数据库的优点
- 事务一致性:通过事务处理保持数据的一致性
- 复杂查询:支持SQL,可以进行 JOIN 等复杂查询
- 容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
- 使用方便:通用的 SQL 语言使得操作关系型数据库非常方便
- 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
-
数据库隔离级别、传播机制,用来解决什么问题
- 未提交读
- 已提交读
- 可重复读
- 串行
第三
-
HTTPS 与 HTTP
利用SSL/TLS 来加密数据包
-
TCP 如何保证可靠性
- 应用数据被分割成 TCP 认为最适合发送的数据块。
- TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- **校验和:**TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- TCP 的接收端会丢弃重复的数据。
- **流量控制:**TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- **拥塞控制:**当网络拥塞时,减少数据的发送。
- **ARQ协议:**也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- **超时重传:**当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
-
拥塞控制的算法
慢开始、拥塞避免、快重传和快恢复
-
滑动窗口
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。
-
单链表快速找中间节点
快慢指针
-
JWT 的优缺点
优点:无状态、可拓展
-
分布式事务协议
第四
-
进程间通信方式
管道、信号量
-
synchronized和volitale
- volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
- volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
- volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
- volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
- volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
-
synchronized 对象锁、类锁
-
内部类的分类及特点
匿名内部类:适合于仅使用一次的类,属于局部内部类的特殊情况 实例内部类:内部类没有使用static修饰 静态内部类:内部类使用static修饰 局部内部类:在方法中的内部类
-
隐式引用
-
为什么需要双亲委派机制
先检查是否已经被加载过,若没有加载则调用父加载器的loadClass方法, 如父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载失败,抛出ClassNotFoundException 异常后,再调用自己的findClass方法进行加载。
双亲委派机制能够保证多加载器加载某个类时,最终都是由一个加载器加载,确保最终加载结果相同。
作者: OnlyWaitY 发表日期:2021 年 7 月 24 日