一、计算机网络
1.1 网络基础知识
OSI七层模型
自下而上
- 物理层:比特流传输,数模、模数转换,网卡工作在此层。
- 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。将比特流封装成帧,交换机工作在此层。
- 网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。路由器工作在网络层。
- 传输层:传输连接管理、处理传输差错、监控服务质量,该层常见的协议:TCP/IP中的TCP协议、UDP协议。
- 会话层:组织和协调两个会话进程之间的通信。
- 表示层:数据格式处理、数据的编码、压缩和解压缩、数据的加密和解密。
- 应用层:它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。应用层的重点是HTTP协议。
1.2TCP3次握手
TCP协议是面向连接的、可靠的、基于字节流的传输层通信协议。
ip地址可以唯一标识一个主机,而TCP协议中的端口号可以一个进程,IP地址+协议+端口号可以标识网络中的唯一进程。
1.2.1 TCP flags
- URG:紧急指针标志
- ACK:确认序号标志
- PSH:push标志
- RST:重置连接标志
- SYN:同步序号,用于建立连接过程
- FIN:finish标志,用于释放连接
1.2.2 为什么需要三次握手才能建立起连接
- 初始化Sequence Number
1.2.3首次握手的隐患-SYN超时
-
client端发完syn包后掉线了,server端回复syn-ack的时候未收到ack确认
-
server不断重试直至超时,Linux等待63秒才断开连接
1.3 TCP的四次挥手
1.3.1 为什么要有TIME-WAIT
- 有足够的时间让对方接受到ack包
- 避免新旧连接混淆,路由器有缓存
1.3.2 为什么需要四次挥手才能断开连接
因为全双工通信,发送发和接收方有需要fin报文和ack报文
1.3.3服务器出现大量CLOSE-WAIT状态
- client请求关闭socket连接,server忙于读或写,没有及时关闭连接。
- 检查代码,通常是某些资源没有释放
- 检查配置,特别是处理请求的线程配置,配置数不合理等。
1.4 TCP和UDP的区别
http://www.jiangzi.com/tuwen/shenghuo/51773.html
1.5 HTTP
1.5.1 在浏览器地址栏键入URL,按下回车之后经历的流程
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器渲染解析页面
- 连接结束
1.5.2 HTTP状态码
- 1xx:请求已接收,继续处理
- 2xx:请求成功接受、处理
- 3xx:重定向–要完成请求必须进行更进一步的操作
- 4xx:客户端错误–请求有语法错误或请求无法实现
- 5xx:服务端错误-服务器未能实现合法的请求
1.5.3 HTTP常见状态码
- 200:响应成功
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized:请求未经授权
- 403 Forbidden:服务器收到请求,但拒绝提供服务
- 404 Not Found:请求资源不存在
- 500 Internal Server Error:服务器发生错误
- 503 Server Unavailable:服务器不能处理当前请求
1.6 cookie和session的区别
- cookie数据存放在客户端,session数据存放在服务器端
- session相对于cookie更安全
- session数据会在服务器保存一段时间,若请求增多会增加服务器负担,考虑减轻服务器负担,应使用cookie
二、数据库
2.1 B+Tree更适合做存储索引
- B+Tree的io代价更低
- B+Tree的的查询效率更稳定
- B+Tree更有利于对数据库的扫描(范围查找)
2.2 Hash索引的缺点
- 仅能满足"=“或"in”,不能使用范围查询
- 无法进行排序操作
- 不能利用部分索引键进行查询
- 不能表扫描
- 遇到大量Hash值相等的情况下,性能并不比B-Tree好,不稳定
2.3 密集索引和稀疏索引的区别
稀疏索引是指如果只是一部分查找码的值有对应的索引记录,则该索引为稀疏索引;
稠密索引是如果数据文件中的每一个查找码值在索引文件中都对应一个索引记录,则该索引为稠密索引;
对数据文件和它的一个特定的索引文件,如果数据文件中的数据记录的排列顺序与索引文件中索引项的排列顺序相一致,或者说,索引文件按照其查找码指定的顺序与数据文件中数据记录的排列顺序相一致,则该索引文件称为聚集索引,否则为非聚集索引。
2.4 如何定位并优化慢sql
- 根据慢日志定位慢查询sql
- 使用explain等工具分析sql
- 修改sql或尽量让sql走索引
2.5 MyISAM与InnoDB关于锁方面的区别是什么
- MyISAM默认的是表级锁,不支持行级锁
- InnoDB默认的是行级锁,也支持表级锁
- InnoDB在没有走索引时,用的是表级锁。
2.6 MyISAM适用的场景
- 频繁执行全表count
- 对数据增删改频率不高,查询非常频繁
- 没有事务,MyISAM不支持事务
2.7 数据库锁的划分
- 按锁的粒度:表级锁,行级锁,页级锁
- 按锁的级别:共享锁(读锁),排他锁(写锁)
- 按加锁的方式:显示锁,隐式锁
- 按操作划分:DML锁(CURD),DDL锁(改表结构)
- 按使用方式:乐观锁,悲观锁
三、JVM
谈谈你对java的理解
- 平台无关性
- 一次编译后生成class文件,可以在其他平台运行
- 为什么要先编译成字节码在解析成机器码?
- JVM不需要对源码进行多次编译检查
- GC垃圾回收器
- 语言特性
- 反射
- 泛型
- lambda表达式
- 面向对象
- 类库
- 异常处理
JVM架构
- Class Loader Subsystem (类加载系统)
- Runtime Data Areas (执行时数据区)
- Execution Engine (执行引擎)
- Native Method Interface (调用C、C++代码)
反射
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Zip7f8r-1640158533690)(imooc.assets/image-20211214170208317.png)]
ClassLoader
- 编译器将Person.java源文件编译为Person.class字节码文件
- ClassLoader将字节码转换成JVM中的Class对象
- JVM将Class对象实例化Person对象
LoadClass和forName显示加载类的区别
Java多线程与并发
进程与线程的区别
线程的六个状态
- 新建New:创建后尚未启动的状态
- 运行(Runnable):包含Running和Ready
- 无限期等待(Waiting):不会分配CPU执行时间,等待其他线程显式唤醒
Object.wait()
、Thread.join()
、LockSupport.park()
- 限期等待(Timed Waiting):再等待一定时间后由系统自动唤醒
Object.sleep()
,Object.wait()
,Thread.join()
,LockSupport.parkNanos()
,LockSupport.parkUntil()
- 阻塞(Blocked):等待获取排他锁
- 接受(Terminated):已中止线程的状态,线程已结束执行
sleep()和wait()的区别
- 基本差别
- sleep是Thread的方法,wait是Object的方法
- sleep可以在任何地方使用,而wait只能在synchronized方法或synchronized代码块中使用
- 本质区别
- sleep方法只会让出cpu,不会改变锁行为;wait方法不仅会让出cpu,还会释放已经占有的同步锁资源
notify和notifyall的区别
- notifyall会让所有处于等待池中的线程全部进入锁池去竞争锁,没有得到锁的线程也不会重新回到等待池,而是找机会重新竞争
- notify只会随机选取一个处于等待池的线程进入锁池去竞争锁
yield方法
- yield方法向调度程序提示当前线程愿意放弃其当前对处理器的使用。 调度程序可以随意忽略此提示。
- yield不会改变锁行为
interrupt方法
- 线程处于被阻塞状态,那么线程将立即退出被阻塞状态,并抛出InterruptedException异常
- 如果线程处于正常活动状态,那么会将该线程的中断标记设为true,此时线程状态将继续运行,不受影响。
Java多线程与并发-原理
synchronized
对象锁和类锁
- 同一个类的不同对象的对象锁互不干扰,所以锁住的是同一个对象才能起到同步的作用
- 由于一个类只有一把类锁,所以一个类的不同对象使用类锁是可以实现同步的
- 类锁和同步锁互不干扰