面试题day12
快手
-
自我介绍
-
实习项目、背景、需求介绍
-
InnoDB优点
外键 行锁 事务 聚簇索引 mvcc 使用场景
-
MyISAM索引底层是什么结构
b+树,遍历层级短,io次数少
-
B树和B+树区别
非叶子节点是否存数据
-
为什么选择B+树不选择B树
单位时间查找效率高,io次数更少
-
MySQL如何支持事务
使用innodb引擎,acid
一致性 原子性 隔离性 持久性
A原子性:靠undo log来保证(异常或者执行失败进行回滚)
D持久性:靠redo log来保证(保证当mysql宕机或者停电后,可以通过redo log最终将数据保存在磁盘中)
I隔离性:事务之间的读写靠mysql的锁机制来保证隔离,事务间的写操作靠MVCC机制(快照读,当前读)来保证隔离性 -
undo log如何保证原子性
回滚日志,read_view,三个字段(最后事务id、回滚指针、隐式主键)
-
MySQL隔离级别、存在的问题
脏读 其他事务未提交数据
不可重复读 数据被修改
幻读 数据新增
-
MySQL如何解决脏读、不可重复读、幻读
mvcc+临键锁
-
如何解决脏读?(读已提交)
mvcc+行锁
-
MySQL如何判断事务有没有提交?
查看事务表
select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx
-
事务A中对id=1进行修改,不提交;事务B中读取id=1的数据,如何判断这个数据有没有被提交?
mvcc
-
InnoDB可重复读是否存在幻读问题
无,mvcc+临键锁
-
如果对记录修改,是否会读到修改的值?
-
LeetCode:8. 字符串转换整数
-
HashMap和HashTable区别
线程安全和null
-
HashTable如何实现线程安全
给每个方法加synchronized,put时只能有一个线程获取到锁
-
其他线程如何知道已经有线程在put(Mark word)
锁状态和锁信息
hash码 线程id lockrecord指针 管程指针
-
Mark word是什么
对象头的一部分
-
synchronized的锁优化
无锁 偏向锁 轻量级锁 重量级锁
-
出于目的写博客;什么时间写博客
-
假设有1,2,3,4,5,6,7,8,9,10 在B+树中存储,是什么样子
-
为什么1和2之间是链表
-
MySQL有哪些索引
- 普通索引
- 是最基本的索引,它没有任何限制
- 唯一索引
- 索引列的值必须唯一,但允许有空值
- 主键索引
- 特殊的唯一索引,不允许有空值
- 组合索引
- 多个字段上创建的索引
- 普通索引
-
为什么会有覆盖索引
select的数据列只用从索引中就能够取得,不必读取数据行
-
table 有a b c d四列,(b c d) 联合索引,selct c,d from table where c = 1会使用这个联合索引吗?
不会
-
为什么覆盖索引存在最左匹配原则
如果第一列相等则再根据第二列单调递增排序,依次类推
-
select c,d from table where b = 1 and d = 2会走索引吗?
不会
-
MySQL中有一些优化,比如ICP,就会将索引下推
当存在索引的列做为判断条件时,MySQL server将这一部分判断条件传递给存储引擎,然后存储引擎会筛选出符合MySQL server传递条件的索引项
-
算法题:LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
-
HashMap底层数据结构是什么
链表散列/红黑树
-
HashMap先不考虑红黑树,手写一个底层数据结构,存储key value
仿照hashmap
-
Java 线程的状态;time-waiting时间到了,进入什么;调用sleep()进入什么状态?time_waiting,那这个time_waiting状态会释放锁吗?锁等待是什么状态?
run
time-waiting
不会释放锁
没拿到锁状态
-
wait() notify() 以及线程状态转换
如果A线程在Runnable(可运行)状态中调用了wait()方法,那么A就进入了Waiting(无限等待)状态,同时失去了同步锁;如果B线程获取到同步锁,并在运行中调用了notify()方法,就会将无限等待的A线程唤醒;如果A线程唤醒后获取到锁对象,就进入Runnable(可运行)状态
-
Java线程状态和操作系统线程有什么不同?
Java线程的 runable=ready+running,操作系统线程分为 running和 ready,并不是合在一起的
-
为什么Java把这两个状态放在一起?
CPU的执行分成很多个小的时间片,cpu转换很快,状态标志不准确
-
自我介绍
-
JVM内存结构
堆 方法区
程序计数器 本地方法栈 虚拟机栈 本地内存
-
堆如何分代
新生代 老年代 永久代 新生代又分为了
Eden
区、Survivor
区。老年代存放着经历多次GC
仍然存活的对象。 -
为什么要分代
分代的唯一的理由就是优化
GC
性能 -
回收算法
标记清楚、标记复制、标记压缩
-
回收算法有哪些具体实现?
Parallel Parallelold
Serial SerialoldParNew CMS
G1 -
TCP三次握手
seq x
ack x+1 seq y
ack y+1
-
TCP 四次挥手
seq x
ack x+1
seq y
ack y+1
-
为什么建立三次、断开是四次
-
四次挥手套接字的状态转移
FIN WAIT 1 (主动关闭)已经发送关闭请求,等待确认 FIN WAIT 2 (主动关闭)收到对方关闭确认,等待对方关闭请求 CLOSE WAIT (被动关闭)收到对方关闭请求,已经确认 LAST ACK (被动关闭)等待最后一个关闭确认,并等待所有分组死掉 -
输入url的流程
缓存 dns ip tcp https
-
http的request、response的具体格式
请求行 请求头 请求体
响应行 响应头 响应体
-
你们的服务是如何部署的?SpringBoot中的Tomcat
-
LRU 如何实现?在哪用过
-
LRU put get 时复
-
100G文件,每行是一个长整数,总行数为N;主机内存1G;结果:输出最大的K个数 (K << N)
维护大小为k的最小堆,如果当前元素大于堆顶元素,入堆。这样,堆中始终存储的是到当前为止,最大的k个数。
大小为k的最小堆会一直存在内存中,因为K << N,所以不考虑内存不够的情况