本文收录于 www.cswiki.top
小伙伴大家好呀,我是小牛肉,最近在准备秋招所以基本没啥时间更技术文了,今年真的卷到爆炸、卷到离谱、卷到起飞、卷到升华,不过乐观来讲也应该是未来五年最容易的一年了(哭泣),这段时间看了不少面经,挑一篇发上来和大家分享下,以后发面经都会尽量带上我的答题思路(蓝色引用中的就是),今日面经来源可文末 “阅读原文“ 直达,时间 2022/06/29
楼主自述:第一次来面大厂,本来不想面的,过了笔试一个月才来,有点紧脏,面试体验非常好(特指面试官非常奈斯)。第一次面这么长时间,还好备了杯水,讲到后面有点没力气了,一直灌水,虽然这样真的有点不礼貌,但真的控制不住寄己。每一次面试都当作一次测验,像这次就感觉到:自己的源码,以及一些和实际生产环境相关的应用不太了解,甚至说不出来几个字,还有有些心里清楚的讲得不好,讲给自己听都有些难懂。。。继续加油吧💪
1)自我介绍
2)项目:用到的技术,登录是单机的还是分布式的
3)多级缓存
4)超卖问题
5)分布式锁
分布式锁的几种方案:
6)线程池参数
最重要的四个参数:corePoolSize、maxsiumPoolSize、workQueue、rejectHandler
7)多线程里用到过的锁
synchronized、Locks 接口(如 ReentrantLock、ReadWriteLock)
8)JUC 里还有啥(CAS)
CAS(Unsafe 类)、Atomic 原子类、ThreadLocal、并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue(ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue)……)
9)乐观锁、悲观锁及其使用场景
悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改(synchronized 和 ReentrantLock 就是悲观锁) 乐观锁:认为自己在使用数据时不会有别的线程修改数据,因此不会添加锁,只是在提交修改的时候去判断一下,在此之前有没有其他的线程也修改了这个数据 使用场景:乐观锁适用于【写操作比较少】的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果写操作比较多经常产生冲突,上层应用就会不断的进行重试,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适
10)Linux 有哪些命令
11)操作系统怎么看日志
应该问的 Linux 怎么看日志,Linux 系统日志一般存在 /var/log 目录下,可以用
cat
、head
、tail
等命令进行查看
12)TCP 可靠性
TCP 保证可靠传输的手段:校验和、序号和确认应答机制、重传机制(超时重传、快速重传、Sack 重传)、流量控制(滑动窗口)、拥塞控制(慢启动、拥塞避免、快重传和快恢复)
13)Http 与 Https 区别
HTTP 不安全:
14)打开网页流程
封装 HTTP 请求报文、DNS 域名解析、TCP 三次握手、封装成 IP 数据报进行传输、ARP 根据 IP 找到 MAC 地址
15)Cookie/Session 比较
16)MySQL 有哪些索引,使用的原则
17)怎么看有没有走索引
explain 看执行计划(USING INDEX)
18)MySQL 执行查询流程?里面的缓存是啥
连接器、查询缓存、解析器、优化器、执行器 当表被修改时,查询缓存中的任何相关条目都会被清空,对于更新比较频繁且流量很大的表来说,这个特性会导致很大的数据库压力
19)设计表时如何设计索引
建立索引的几个原则:
20)MySQL 有哪些锁
悲观锁:
乐观锁:手动实现,添加 version 列
21)Redis 的数据类型
String(底层:long 型整数、embstr 编码的 SDS、SDS)、List(底层:ziplist、linkedlist)、Set(底层:intset、dict)、Zset(底层:ziplist、skiplist + dict)、Hash(底层:ziplist、dict)
22)Redis 的使用场景
做 cache or storage,可以根据每种数据类型说说具体的应用场景:
23)Java 集合 Map->HashMap
Java 集合包括 List(ArrayList)、Set(HashSet)、Map(HashMap) HashMap 原理关键点:
24)ConcurrentHashMap 为什么安全
可以先说下 HashMap 为什么不安全(JDK 1.7 循环链表、JDK 1.8 并发 put 导致数据被覆盖),然后解释下 ConcurrentHashMap 的原理,关键点:
25)TreeMap 底层
26)JVM 内存模型(JMM)
线程工作内存 + 主内存。线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。可扩展如何保证可见性(synchronized/Locks、volatile、final,三大并发关键字都能保证可见性!)
27)JVM 内存调优
28)JVM 垃圾回收器
29)算法题:字符串相加
心之所向,素履以往,我是小牛肉,小伙伴们下篇文章再见