Java知识点记忆点-补充
2021年4月11日 · 10751 字 · 22 分钟 · Java
什么是微服务?
将单体系统拆分职责相对于单一的一个个项目,每个项目提供不同的服务内容,服务之间的通过rpc来调用
一个服务的宕机、不可用,不会影响上下游服务,做到服务熔断隔离。根据每个服务访问流量的大小,指定服务的扩容和缩容,更加独立的进行,减少不必要资源的消耗。
Java基础
抽象类和接口的区分?什么时候用接口 什么时候用抽象类?
抽象类主要是复用代码,将不同类具有相同行为A属性,交给抽象类实现,避免子类都去实现
接口只能定义方法(类行为的约束),类可以实现接口重写必须实现的方法,也可以额外写其他行为方法
Java虚拟机
GC Roots指的是哪些对象?
JVM栈中本地变量表中引用的对象
方法区中类静态属性引用变量
方法区中常量引用对象
本地方法栈中Native方法
方法区的回收有哪些对象?
废弃常量的回收、无用类的回收
- 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类及其任何派生子类的实例。 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如 OSGi、JSP 的重加载等,否则通常是很难达成的。
- 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
Spring框架
Spring和SpringBoot的区别?
springboot极大简化spring所需要的配置
内嵌了tomcat容器 简化部署
引入starters 集合应用依赖包 快速搭建业务框架
Spring的事务隔离级别有哪些?(四种)
采用默认的隔离级别(DB是怎样隔离级别 那Spring就是怎样的隔离级别)[MySQL默认是可重复读]
读未提交(read uncommited)[脏读、不可重复读、幻读]
读已提交(read commited)[避免脏读,但可能不可重复读、幻读]
可重复读(repeatable read)[避免脏读和不可重复读,但可能幻读]
串行化(Serializable)[避免以上问题]
Spring的事务传播级别有哪些?(七种传播行为)
支持当前事务:
当前有事务加入事务,没有事务,新建事务
当前有事务加入事务,没有事务,以非事务方式运行
当前有事务加入事务,没有事务,抛弃异常
不支持当前事务情况:
前提:t <- 事务(transaction)
if 当前 ∃ t -> t 挂起,创建新的事务t'
以非事务的方式运行,if 当前 ∃ t -> t 挂起
以非事务的方式运行,if 当前 ∃ t -> thows exception
If 当前∃ t -> 则创建一个事务作为当前事务的嵌套事务运行
Spring中有哪些设计模式?分别有哪些
IOC:工厂模式 + 反射
AOP:代理模式
JDBCTemplate:模版模式
Spring中Bean:单例模式
SpringMVC中的适配器HandlerAdatper:适配器模式
spring的事件驱动模型(ApplicationListener):观察者模式
Spring中Observer模式常用的地方是listener的实现
Spring装饰器模式:在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。
https://cloud.tencent.com/developer/article/1593982
代理模式和装饰器模式的区别?
代理模式是对代理对象加以控制,比如在对象前置或者后置,帮助你完成其他不用关心的事情,比如日志
装饰器模式是对装饰对象功能的增强,还是调用之前的方法,但有新的功能,是继承的替代模式
有哪些方法可以实现单例模式?
懒汉式(当只有在使用时才进行类对象创建)
饿汉式(静态常量、静态代码块)
双重检验锁也是懒汉式
静态内部类(静态属性只有在第一次加载类的时候初始化,通过getInstance)
枚举
数据库MySQL
数据库的事务特性?(四个)
原子性、一致性、隔离性、持久性
MySQL的事物并发问题
脏读、不可重复读、幻读
MySQL事物隔离级别
读未提交、读已提交、可重复读、可串行化
什么是MVCC?怎么解决并发一致性问题
多版本并发控制,创建版本号和删除版本号(创建数据行的快照时的系统版本号)
可重复读下,对数据行修改事务T1,读取的数据行快照的创建版本号 < 事务T的版本号(比较)
读取的数据行快照的删除版本号 > 事务T的版本号 否则表示这行数据已被删除
MVCC解决了哪两种隔离级别?
提交读 和 可重复读
如何解决幻读问题?(在X隔离级别使用XX和XX)
可重复读隔离级别 + Next-key locks
Next-key Lock: {
1. record lock (锁一个记录上的索引,而不是记录本身,没有索引自动在主键上创建聚簇索引)
2. gap lock (锁定索引之间的间隙,但不包括索引本身)
}
间隙锁锁的是哪些范围?什么操作导致间隙锁
快照读和当前读的区别?
select XXX 进行快照读 从undo log中快照获取
select XX for update 加锁保证拿取最新的数据
每条记录更新同时记录一条回滚记录(回滚操作记录undo log)
数据库三范式?
第一范式:表中所有属性为最小原子属性,不可在分割 不能表中嵌套表
第二范式:属性对主键不存在部分函数依赖(学号、姓名、性别、年龄、课程号、分数)主键[学号、课程号]
第三范式:属性对主键不存在传递函数依赖(学号、姓名、学院、院长)主键[学号]
如何解决第二、第三?(看业务场景使用不同的范式)
undo日志用来干嘛?binlog日志?redo日志?
mvcc使用undo log(回滚日志:记录每行数据的版本)来实现快照 保存事务发生之前数据的快照版本,可以回滚
redo log innoDB引擎层日志(重做日志【往前滚- 数据页的物理修改,且只能恢复最后一次提交的位置】):记录事务操作变化后数据修改之后的值,不管事务是否提交都会记录。万一DB宕机异常启动,使用redo log恢复数据。
binlog(归档日志)是二进制文件,是MySQL Server层记录的日志。MySQL主从复制中,从库用主库的binlog进行复制
(binlog只记录对数据的修改操作,用于主从复制、增量恢复)
redo log
是innoDB存储引擎层的日志,用来记录数据库事务操作的变化,记录是的数据修改之后的值,无论事物是否提交都会记录。在实例或者介质crash,redolog派上用场,用来恢复数据,保证数据的完整性。
更新操作涉及到write ahead loging,先写日志在写磁盘。inndb先把更新语句写redo log再更新内存,语句执行完毕后,在空闲的时候或者按照设定的更新策略将redo log中内容更新到磁盘当中。
有了redo log,在db异常重启时候,根据redo log恢复,实现crash-safe
redo日志有固定大小,写满需要重头写
InnoDB是如何实现事务?
InnoDB实现事务 -> ACID:使用这三个日志 + 锁(排他锁/共享锁)
原子性:undo log(回滚日志):记录数据修改前的状态,万一回滚恢复之前的状态
一致性:redo log(重做日志):记录数据修改后的状态
隔离性:锁(行级锁、表锁),可分共享锁、排他锁
持久性:undo log(回滚日志) + redo log(重做日志)
binlog文件是什么?存储的数据形式有哪些?有什么优缺?
bin log(二进制日志文件),只记录对数据的修改操作,主要是主从复制和增量恢复
MySQL binlog日志三种格式?
- Statement:每一条会修改的SQL都会记录到binlog中
(优点:减少日志量 - 缺点:主从复制中,带有特定函数的SQL,从库执行可能出现不一致问题)
- Row:不记录SQL语句上下文信息,仅保存哪条记录被修改成什么样
(优点:不需要记录SQL的上下文信息,以每行记录的修改来记录,解决SQL带有特定函数的问题
缺点:biglog日志量大(update多条,每一条修改都会记录))
- Mixedlevel:以上两种level混合使用
[一般语句的修改使用Statement格式保存,一些函数无法则使用Row格式]
会根据每一条具体的SQL语句来区分记录的日志形式
MySQL主从复制怎么实现?
binlog线程、io线程、sql线程
1.binlog dump线程将主服务器上的数据更改写入二进制文件(Binary log)
2.io线程负责从主服务器中读取binlog,并写入从服务器的中继日志(Relay log)
3.sql线程读取中继日志,解析主服务器已执行的数据修改,并在从服务器进行重放(Replay)
MySQL的crash-safe怎么实现的??
三个日志+WAL+2PC
https://cloud.tencent.com/developer/article/1631999
为什么需要分库分表?
数据量太大,查询效率低下
怎样分库分表?
垂直拆分:按照业务(订单、商品)放在不同数据库,独立出来,就算一个业务出错不影响另一个业务,提高并发
缺点:无法解决单表数据越来越大的问题
水平拆分:将单表数据拆分多表,甚至放在不同库当中。按照日期时间划分、按照hash取模划分
采用Apace sharding-jdbc来作分库分表中间件
注意⚠️!需要做不同纬度的数据冗余,方便根据不同纬度的查询(空间换时间的方式)
索引优化有哪些?(哪些情况下索引会失效?)
只针对频繁查询的字段 设置索引
可以使用覆盖索引
避免索引失效(使用全值匹配、符合最左前缀原则[中间索引不能断])
失效:
where条件后用函数、运算符
模糊查询 like’%冰’(使用通配符开头)
不符合最左原则的联合索引
索引字段上!= <>这样会导致索引失效(is NULL / is not NULL)
索引case!!!注意⚠️
联合索引(a、b、c)
a = ’’ and b = ’’ and c = ‘’(全都命中索引)
c = ’’ and b = ’’ and a = ‘’(全都命中索引,有SQL优化器)[连接器、查询缓存、分析器、优化器、执行器]
a = ’’ and c = ‘’(只有a命中,因为b没有,联合索引中间索引无)
a = ’’ and b > ’’ and c = ‘’(只有a和b命中,因为b时一个范围值,算是断点)
如果联合索引中有主键a
b = ’’ and a = ’’ (只会走主键a,因为B+树索引结构)
Where和Order by 索引字段
使用联合索引idx(a,b)
//可以走索引idx
where a = "xx" order by b
Mysql的order by 会根据创建联合索引顺序进行排序 且asc
https://stackoverflow.com/questions/9641463/mysql-not-using-index-for-order-by/38071094
Redis
Redis的五大基本类型?
- String
- List
- Set
- SortSet
- Hash
SortSet底层数据结构是怎么存储的?
有两种数据结构:压缩表ziplist和跳表skiplist
压缩表(如果有序保存元素数<128 || 长度<64byte)
skiplist按序保存元素分值,使用dict来保存分值和元素的对应关系(有序链表 + 多级索引结构(关键节点))
时间复杂度:O(logN) 空间复杂度:O(N)
跳表插入数据
1.新节点和各层索引节点逐一比较,确定原链表的插入位置。O(logN)
2.把索引插入到原链表。O(1)
3.利用抛硬币的随机方式,决定新节点是否提升为上一级索引。
结果为“正”则提升并继续抛硬币,结果为“负”则停止。O(logN)
总体上,跳跃表插入操作的时间复杂度是O(logN),而这种数据结构所占空间是2N,既空间复杂度是 O(N)。
跳表删除数据
1.自上而下,查找第一次出现节点的索引,并逐层找到每一层对应的节点 O(logN)
2.删除每一层查找到的节点,如果该层只有一个节点,删除整一层(除去原链表之外)O(logN)
总体来说,删除O(logN)
如何解决Redis存储String类型大的JSON数据格式的问题?
可以使用中间件,对大的JSON字符串格式数据进行压缩
Redis的过期时间是怎么实现的?
RedisDB中有Expires字典保存DB中所有key的过期时间(过期字典)
键是一个指针指向数据库键
值是一个long类型的毫秒unix时间戳
判断key -> 找过期字典 -> 判断现在unix时间戳是否大于key的value
Redis的过期键删除策略有哪些(三种)分别是怎样,优缺点
定时删除:key一旦到达过期时间,立马删除
惰性删除:当getKey的时候,发现已到过期时间就删除返回nil
定期删除:每隔一段时间,扫描过期key,进行删除
定时删除:对内存友好,但对CPU时间不友好[降低服务器吞吐量和响应时间]
惰性删除:对内存不友好,大量过期的key放在DB中一直不被删除
定期删除:前两者折中方式,每隔一段时间执行删除过期key操作,限制删除key执行时长和频率
惰性删除:通过读写DB之前执行expireIfNeeded函数对输入key检查(过滤器)
定期删除:调用activeExpireCycle函数 在规定时间内分多次遍历服务器中各个数据库,从数据库Expires字典中随机检查一部分键的过期时间,过期则删除。
Redis的持久化机制会有哪些(两种)分别是怎样的,优缺点
RDB:对数据生成快照方式,保存键值对记录数据库,存储二进制的RDB文件(可设置每隔一段时间进行save)
AOF:保存对Redis执行写的操作命令,通过追加append方式添加命令
AOP可以设置同步参数,一秒同步,redis宕机最多丢失一秒前数据
如果需要对大规模数据进行恢复,对于数据完整性不是非常敏感,RDB对AOF更加高效
对数据量较大的进行RDB持久化,没法做到秒级来save/bgsave
反之,对数据完整性敏感性十足,使用AOF,做到最多丢失一秒之前的redis数据
AOF重写是怎样的?
Redis通过创建一个新的AOF文件来替换现在的AOF文件(新旧文件保存DB状态相同)
不读取现有的AOF文件,而直接读取服务器当前DB的键现在的值,然后用一条命令记录 代替之前多条命令
首先从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令,这就是AOF重写功能的实现原理。
为了不影响处理其他命令请求,将AOF重写交给子进程(带有Master进程的副本,避免使用锁,保证数据安全)
AOF重写期间服务器进行命令处理,导致数据不一致怎么办?
Redis创建一个AOF重写缓冲区,在创建子进程后使用
AOF重写期间,服务器进程工作:
执行客户端命令
将执行后命令追加AOF缓冲区
将执行命令追加AOF重写缓冲区
当子进程完成AOF重写后,向父进程发信号,父进程接收到将AOF重写缓冲区中所有内容写入新AOF文件中
再进行新的AOF改名 原子性覆盖现有的AOF文件,完成替换
AOF、RDB和复制功能对过期键的处理?
RDB
生成RDB文件:创建RDB文件,对数据库中key检查,会忽略过期键,只保存有用的key
载入RDB文件:(但主从服务器进行RDB文件载入,主会忽略,从会加载已过期key进去)
AOF
AOF文件写入:AOF会追加append 该key被删除的del命令到AOF文件中
AOF重写:和生成RDB文件一样,对DB中key检查,已过期的不会保存
为什么Redis支持高并发量,速度快?
Redis是内存型DB,直接对内存读写速度快
Redis使用io多路复用,可以处理并发请求,采用epoll单线程轮询多个socket方式,处理事件。
(非阻塞io采用epoll,读、写、关闭、连接转化成事件,减少io时间)
- Redis是单线程的,io多路处理的需要执行命令放在队列当中,单线程逐个执行,保证不会同时执行
避免产生多线程上下文切换,或者产生死锁等,性能消耗
Redis底层数据结构,压缩表、跳表、hash..高效的存取数据结构
采用io多路复用,监听多个客户端socket,将socket事件放在队列当中,单线程处理
再交给文件事件分配器处理,分给不同的事件处理器进行处理(set、get、连接请求等处理)
select和epoll的区别?阻塞io 非阻塞io io多路复用 异步io分别?
select、poll用监视多个socket描述符,单线程轮询来判断数据是否就绪,就绪返回信号。还需要再一下轮询找到确定socket进行处理,而是epoll会把轮询已就绪的socket事件放在自己创建的链表中,epoll只关心链表有无数据就可。
epoll不需要通过遍历的方式,而是在内核中建立了file节点,并且通过注册响应事件的方式,当有响应事件发生时采取相应的措施,并把准备就绪的事件放入链表中,从而epoll只关心链表中是否有数据即可。
epoll只需要一次拷贝就可以 其他select需要每次遍历过后在用户态-内核态中相互拷贝
Redis分片有了解吗?
https://developer.aliyun.com/article/692428
Redis主从复制?
https://www.cnblogs.com/kismetv/p/9236731.html
Redis的高可用是怎么实现的?
Redis提供持久化机制、主从复制(读写分离)、集群+哨兵
持久化:针对于单机备份(从内存到磁盘)
主从复制:侧重在于多机的数据备份,实现读写分离、读的负载均衡和故障恢复
从节点保存主节点(masterhost和masterip)存储主节点的ip和port信息
从节点会每秒调用定时函数replicationCron,发现主节点可以连接那就进行socket连接
从节点建立事件收集器,比如接收RDB文件、接收命令
集群+哨兵:
在复制基础上,哨兵解决自动化的故障恢复
哨兵监控:不断检查主节点和从节点是否运行正常
自动故障转移:当主节点不可用,升级其中一个从节点为主节点,其他从节点修改复制目标节点
配置提供者:客户端连接时通过连接哨兵,拿到当前redis主节点的地址
通知:哨兵会将故障转移的结果通知客户端
集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
Redis的内存淘汰策略有哪些?
已设置过期时间的数据集 LRU数据淘汰
已设置过期时间的数据集 即将过期的数据淘汰
已设置过期时间的数据集 选择任意数据淘汰
全局数据集keys LRU最近最少使用key淘汰
全局数据集 任意选择数据淘汰
禁止驱逐数据(满了存新的数据 直接报错)
Redis中会出现哪些问题?(雪崩、击穿、穿透)
雪崩:keys的过期时间设置随机数值
击穿(缓存 db都没有的数据):缓存空对象设置较短的过期时间(五分钟),或者使用bitmap设置布隆过滤器
(一定不存在的数据请求会直接过滤 无法打到db)
- 穿透(热点数据缓存过期):互斥锁,只要有一个请求访问来DB带来新的缓存,再释放锁
消息队列
RocketMQ的实现原理是怎样?
RocketMQ由NameServer提供服务注册、Product生产者、Consumer消费者、Broker(RocketMQ进程)
Broker在启动时,向所有的NameServe注册,并保持长连接,每30s发送心跳
Product发送消息时,先从NameServer上获取Broker服务器地址,然后根据负载均衡算法选择一台服务器
来发送消息
- Consumer消费消息时,从NameServer上获取Broker地址,然后主动拉取消息
RocketMQ怎么实现这么高的吞吐量的(高可用)?
RocketMQ分Product、Consumer、Broker、Name Server
都是以集群的方式部署(可以支持多master 模式、多master多slave异步复制模式、多 master多slave同步双写模式)
支持10亿级别的消息堆积,不会因为堆积导致性能下降
支持海量的topic
RocketMQ怎么保证消息不丢失?
producer端 采用同步发送消息,回调获得发送结果是否success
发送失败,会发送重试(三次)
broker端
设置同步刷盘(默认是异步刷盘)持久化采用CommitLog来落盘
集群部署,主从模式,高可用(万一master挂,使用slave继续转发[master接受到消息会同步slave])
consumer端
at least once消息消费会发ack确认给broker
RocketMQ的消费信息是以什么样的形式进行存储?
ByteBuffer msgStoreItemMemory
[存储编码后的消息,即将消息转换成字节的方式
和对象的序列化不同,不仅仅有消息体内容,还加上额外信息(消息创建时间、消息生产者的host、消息体的长度、topic…)]
(需要查看源码确认)
RocketMQ怎么保证消息不重复消费?
生产者没必要做幂等性
消费者端做好幂等性,确保重复的请求不会造成影响。
比如:判断DB是否消费,在数据库使用唯一索引,保证消息只被消费一次。
- 消费端处理消息的业务逻辑保持幂等性
- 保证每条消息都有唯一编号且保证消息处理成功和去重表的日志同时出现
RocketMQ怎么保证消息的有序性(顺序消费)?
同一topic,同一个queue,发消息的时候一个线程去发送消息,消费的时候 一个线程去消费一个queue里的消息
2021.11补充:
消费者的消费queue和协程关系是怎么的?一对一还是多?无序和有序消费区别是什么?
顺序消费是每个queue分配一个协程去处理,比如workerA从queue1中拉取,会放在buffer中
虽然是messageBuffer数组,但无序对应是一个同一个messageChan(存放message)
无序:每个协程对应是同一个messageBuffer
有序:每个协程对应不同的messageBuffer
名称\比例 | 消息queue | messageBuffer | 协程worker |
---|---|---|---|
无序disOrderly | n | 1 | n |
有序orderly | n | n | n |
多个协程怎么分配到对应的message,进行获取对应消息进行消费?
无论无序消费还是有序消费,都是从协程分配的messageBuffer从获取message进行处理
- 不同之处:
- 无序,就算消费组重启需要变更,rebalance,需要给多个queue(消息)重新分配对应的协程,但多个协程对应还是同一个buffer,消息继续发,可能其他协程停了,但其他协程继续直接拿来就消费。
- 有序,则多个协程序对应多个buffer,可能有协程停了,对应的buffer channel没法消费,持续积压,只有rebalance完分配了新协程就可以继续消费,消费速度降低,会导致积压上升。
同个comsumer对应多个协程从自己对应的messageBuffer获取message消费,是跟拿取的一样并发消费的吗 (有序无序)?
- 源码中,并发的开多协程从buffer获取消息,然后各个协程消费buffer channel,说明协程也是并发消费消息,消息分发到各个协程当中,互不影响一起消费。
- 感觉看作每个协程消费也是一个队列,多个队列并发消费。
有序如何设置无限重试的?设置retryTime控制次数可不可以?
可以(两个条件是或者的关系)
一个topic下有多个队列,为了保证有序,RocketMQ提供了MessageQueueSelector队列选择机制
我们可使用Hash取模法,让同一个订单发送到同一个队列中,再使用同步发送,只有同个订单的创建消息发送成功,再发送支付消息。这样,我们保证了发送有序。【在同个队列中消息是有序】
RocketMQ仅保证顺序发送,顺序消费由消费者业务保证!!!(消费端幂等性)
生产者顺序发送,消费者顺序消费setOrderly = true
计算机网络
OSI七层模型
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
TCP/IP四层体系模型?
应用层、传输层、网际层、网络接口层
TCP/IP(参考)模型与OSI七层模型有什么异同?
OSI七层模型是站在完整、宏观纬度上计算机网络分层
TCP/IP四层模型是围绕TCP/IP网络中通信协议来进行分层
HTTP基本组成?
header + body
HTTP常见字段有哪些?
Host字段(服务器域名)
Content-length(服务端返回的数据长度)
Content-type(服务端回应,告诉客户端这次数据是什么格式,text/html; charset=utf-8)
Content-Encoding:gzip(服务端返回数据是什么压缩格式)
Connection(客户端要求服务器TCP持久连接,请求复用keep-alive)
HTTP常见的状态码有哪些?
200 请求ok
301 永久重定向
302 临时重定向
400 bad request 客户端请求报文有误
404 not found客户端请求资源服务端不存在
403 forbidden 客户端无权限访问资源
500 内部服务器错误
502 bad gatway 服务端作为网关或者代理时返回错误码
503 服务器忙,无法回应
301 302状态码的区别?
301永久重定向
302临时重定向
HTTP有哪些请求操作?分别
get、post、put、delete、head、options、patch
Get和Post区别
HTTP哪些请求是安全和幂等的?
get head options
HTTP的优缺点分别是?
明文传输(易窃听)
无法验证通信双方的身份(易伪装)
无法证明报文的完整性(易篡改)
为什么HTTP是无状态的?
使用无状态的,应对大量的请求只需要来了服务端接收请求,处理完断开连接。
减轻服务端设计,不然每个访问网站的用户,服务器都要保存他们信息,是服务器负担
cookie和session?
HTTP和HTTPS有什么区别?
什么是对称加密/非对称加密?
HTTPS怎么加密的(混合加密)?
TCP的三次握手、四次挥手过程是怎样?
为什么说TCP是可靠的?(超时重传)
TCP的流量控制、拥塞控制是怎样实现?(丢包)
(慢开始、拥塞避免、快重传、快恢复)
发送方维护一个拥塞窗口(cwnd)状态变量
慢开始:发送的报文数令cwnd=1,发送方只能发送一个报文段;当收到确认后,将cwnd加倍
2、4、8、16….(报文段数量)
拥塞避免:设置了(阈值)ssthresh,当cwnd >= ssthresh,进入拥塞避免,每轮只将cwnd + 1
超时情况:如果出现了超时,将ssthresh = cwnd/2,重新执行 -> 慢启动
快重传:接收方每次接收到报文段,都会对最后一个有序报文段进行确认。ex:已收到M1、M2、现在接收到M4,
应当对M2进行确认。发送方接收到三次重复的确认,就知道下一个报文段丢失,立即快重传M3
属于个别报文段丢失,执行快恢复,ssthresh = cwnd/2,cwnd = ssthresh,直接进入拥塞避免
TCP和UDP的区别?
使用TCP、UDP的例子?
什么是ARP协议
什么是ICMP协议
什么是DNS
什么DHCP
海量数据场景问题
bitMap
使用最小堆
spring三级缓存
cms和g1垃圾收集器
操作系统
进程的几种状态
https://www.jianshu.com/p/ac9ce2afd126
就绪、进行、阻塞
线程的几种状态
https://blog.csdn.net/pange1991/article/details/53860651
https://www.liaoxuefeng.com/wiki/1252599548343744/1306580742045730
New:新创建的线程,尚未执行;
Runnable:运行中的线程,正在执行
run()
方法的Java代码;Blocked:运行中的线程,因为某些操作被阻塞而挂起;
Waiting:运行中的线程,因为某些操作在等待中;
Timed Waiting:运行中的线程,因为执行
sleep()
方法正在计时等待;Terminated:线程已终止,因为
run()
方法执行完毕。
输入url到返回数据有用到哪些协议?
DNS协议、TCP协议、IP协议、ARP协议、HTTP协议
过程?
DNS解析、TCP连接、发送HTTP请求、服务端处理请求返回HTTP报文、浏览器解析渲染、连接结束
Mysql explain 各字段解释
线程池
有哪些参数?怎么设置?工作机制?
拒绝策略有哪些?
核心线程数、最大线程数、空闲时间存活时间、存活时间单位unit、阻塞队列、拒绝策略
拒绝策略:静默丢弃、直接抛异常、交给调用方处理、丢弃队伍中最老的任务