Java
垃圾回收
分配和回收策略:对象有限在eden区分配,如果不足发生ygc,复制之后转移到survive区,大对象进入老年代。老年代gc通常伴随一次ygc
运行时内存
运行时数据区域:栈,堆,方法区(存放类,常量)
方法区也可以称为永久代
常量池是永久代的一部分
类型擦除(TODO整理)
编译后的字节码没有泛型信息,编译后的类型以bound作为参数类型。所以,赋值object是没有问题的,但是取出之后不兼容导致转换错误
1.转换包括泛型方法, 2.取出的时候加上checkcast 3.生成桥接方法,桥接方法的内容就是put(Object e){ put((Integer)e)}
桥接方法,以继承为例,setData(T t)子类实现setData(Integer i), 最终编译出来父类和子类方法不重载,为了使得重载发生,会生成一个Object参数的桥接方法委派给子类重载的方法。这样,父类引用调用setData时,尽管会调用Object的参数方法,但实际最终转向了子类的方法。
类加载器
类加载器:加载,验证,准备,解析,初始化
volatile
写入可见性和禁止指令重排序
设计模式
HTTPS
通信过程: 1+4+3+1
Client Server
-------------------------------------
ClientHello ->
<- ServerHello
<- ServerCertificate
<- ServerKeyExchange
<- ServerHelloDone
ClientKeyExchange->
ChangeCiperSpec->
ClientHelloDone->
<-ChangeCipherSpec
ApplicationData <-> ApplicationData
TCP/IP
通信过程
Client Server
-------------------------------------
SYN->
<-SYN,ACK
ACK->
...
FIN->
(FIN_WAIT_1)
<-ACK
(FIN_WAIT_2)
(CLOSE_WAIT)
<-FIN
(LAST_ACK)
ACK->
(CLOSED)
(TIME_WAIT)
(wait 2MSL)
(CLOSED)
MSL=报文最大生存时间,一般2分钟,因此TIME_WAIT等待4分钟。
TIME_WAIT:是主动发起关闭的一方最后的状态,主要是避免对方收不到LAST_ACK,这样对方就会重复FIN,然后这个时间内可以重新应答ACK。
为什么是2MSL:ACK报文可以在1MSL内丢失,然后另一方可以在1MSL内重传。
问题
半连接状态
服务器发送 SYN-ACK之后就,在收到ACK之前一直处于SYN_RECV状态,这个状态称为半连接状态。
如果服务器存在大量的半连接状态,则意味着服务器正在经受DDOS共计。
为什么要四次挥手
全双工,正在传输的数据不受影响
每个系统有多少个TCP/IP模块?
1个,操作系统统一实现TCP/IP协议栈,通过端口将数据交付给进程。
backlog的含义
系统中每个TCP连接由(源地址, 目标地址)标识, 每个连接有一个专门的accept queue,当这个queue满了之后就不能再接收新的请求, backlog就是指定这个queue的大小。
Linux中系统受到SYN之后并不直接进入accept queue,而是进入syn queue,只有转移到ESTABLISHED状态才会进入accept queue。
syn queue的大小通常是系统决定的。
CLOSE_WAIT状态怎么产生和转移
在收到客户端FIN并发送ACK之后,服务器进入CLOSE_WAIT状态。
当服务器主动调用close时会发送FIN给客户端,进入LAST_ACK状态然后关闭连接。
当系统中因为服务器未正确调用close,而进程终止之后,由于客户端的FIN_WAIT_1会经过一段时间超时进入关闭状态,而CLOSE_WAIT状态则不会,因此会导致系统产生大量的CLOSE_WAIT状态。
一般面试题:浏览器输入网址的全过程
1.DNS协议解析域名
2.
操作系统
Linux
Shell
如何查看TCP连接状态?
ss
进程创建
资源申请:数据段,代码段和堆栈
进程号分配
进程的TSS结构
死锁产生的必要条件
1.互斥 2.不可剥夺 3.请求与保持(已经持有一个资源,还要请求另一个资源) 4.循环等待链,{P0,P1,…,PN-1}这些进程中,Pi等待Pi+1的资源
预防死锁:1.进程在等待过程中可以释放资源 2.预分配资源 3.资源编号,并按照递增的方式分配资源,递减的方式释放资源
Redis
支持的数据类型
字符串,数字,列表,有序列表,Hash
持久化
RDB持久化:定期持久化数据库
AOF:将写入的命令添加到文件末尾
集群和分片
将key hash映射到slot上,一个集群总共处理16384个slot,通过CRC16(key) % 16384来计算key,然后分配到服务器上。如果有n个服务器,则每个服务器的区间是 [i, i+16384/n]
实现锁
setnx 如果不存在则返回1,否则返回0
一致性hash
将key映射到0~2^32的圆上,然后寻找最近一个匹配的服务器
扩容与缩容
redis使用桶实现hash结构,因此当元素数量(used=所有kv数量,每一个链表的kv和)/桶数量≥1(执行bgsave,bgrewriteaof是5)时,也就是每个桶的平均装载达到1时,进行扩容。redis扩容是增量式,扩容时首先分配空间,然后标记每一个key是在老的表中还是新的表中,在老表中的元素移动到新表。维护一个rehash index,每移动完成一个index,就增加,直到所有元素完成。扩容期间需要先在老表上进行查找,然后再在新表上查找。
负载因子小于0.1时,开始收缩。
Kafka
如何避免重复消费
MQ
Spring
数据库
B+树,所有叶子节点位于同一层,每个节点至少含有m/2个数据,至多含有m个数据,每个节点可查找k个区间。
B树和B+树
B+树的内部节点存储在内存中,而叶子节点存储在磁盘上。
叶子节点之间有指针相连
https://www.geeksforgeeks.org/introduction-of-b-tree/
每个B+树的节点有c个指针,c-1个关键字, 一颗度为a的B+树每个节点至多有a个指针
ACID
原子性,一致性,隔离性,持久性
Explain
主要看type
- ALL 表示全表扫描,即需要加载全表到内容进行扫描
- index 索引扫描,只需要扫描索引树
- range 只遍历某些行
- const 常量扫描
聚簇索引
聚簇索引是指非主键都指向主键,主键指向最终的数据
InnoDB是聚簇索引
编译器
有限状态自动机和无线状态自动机
语法和文法
设计模式
单例模式
实现单例有几种模式
Hashmap的实现
如果指定初始容量,则只有达到初始容量之后才会进行扩容。
扩容会找到当前tableSize的下一个2的幂,然后进行扩张。
ConcurrentHashMap的实现
使用分段实现。
数据结构
红黑树
根节点是黑色,红色节点的子节点是黑色,从根节点到叶子节点的黑色节点数目相同
性质1:最长路径至多是最短路径的两倍
算法细节
1.堆排序过程
只需从 i=floor(n/2)到1进行建堆就可以了,因为大于floor(n/2)的所有节点都是一个元素的堆。建堆的过程其实就是在合并这个n/2个堆的过程,使用的是一个siftDown的过程。
siftDown:选择3个元素的最大值,然后将其下沉到合适的位置。
分布式
CAP理论
一个系统不能同时满足一致性,可用性和分区容错性的
分区容错性是指系统的分区之间发生网络故障不影响系统对外的可用性,即系统能够容忍分区网络故障。
BASE理论
基本可用,软状态,最终一致性
项目细节
自我介绍
名字+毕业时间和院校+简短的工作经历+当前从事的事情