大厂面试题解析(持久更新)
本文作者:FUNKYE(陈健斌),杭州求职程序员,364176773@qq.com,即是邮箱也是qq,也是微信.欢迎各路大佬内推引荐.(仅限杭州地区谢谢)
美团(到店营销)
JVM 结构:
本地方法栈,虚拟机栈,程序计数器,堆(Young(eden,s0,s1),Old)),元数据区
垃圾回收算法:
1.复制回收(新生代),标记清除|标记整理(老年代),
2.GC 时间标准(Minor GC(新生代)<50ms,10S/1,Full GC(老年代)<1s,10m/1)
3.如何调优(不断地分析和调整GC类型和内存分配)
Guava 限流器实现
令牌桶算法是一个存放固定容量令牌(token)的桶,按照固定速率往桶里添加令牌,每隔1/用户配置的发送速率添加一个令牌到桶中,桶中达到最大令牌数量后丢弃/拒绝多余,N个字节大小就删除N个令牌,N>现有令牌将被等待或丢弃
线程池execute执行流程
- 工作线程数小于核心线程数时,直接新建为核心线程执行;
- 大于核心线程数时,将任务添加进等待队列;
- 队列满时,创建为非核心线程执行;
- 工作线程数大于最大线程数时,拒绝任务
分布式锁
redis实现setnx设置过期时间防止死锁,失败,重试机制
限流算法
计数器算法:
1 | public class CounterTest { |
以上的代码有缺陷,会有临界值判断漏洞,优化方法就是把窗口时间跟最大请求数分为无数个小窗口组成,每一个窗口都有计数器来计算.窗口越多的话限流越精确,越平滑.
令牌算法:
原理:
所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
根据限流大小,设置按照一定的速率往桶里添加令牌;
桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;
请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;
令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流;
漏桶算法:
原理非常简单,直接以一个水桶被一定的速率去注入相应的水量,这时候水满了,肯定就溢出了(丢弃),而水由请求里,可以说有人不断的去倒水,消耗桶中的水量.
Dubbo 协议区别:
特性\协议 | dubbo默认 | rmi | hessian | http | webservice |
---|---|---|---|---|---|
连接个数 | 单 | 多 | 多 | 多 | 多 |
连接方式 | 长连接 | 短 | 短 | 短 | 短 |
传输协议 | TCP | tcp | http | http | http |
传输方式 | NIO 异步传输 | 同步传输 | 同步传输 | 同步 | 同步 |
序列化 | Hessian 序列化 | java标准序列化 | hessian序列化 | 表单序列化 | soap文本序列化 |
适用范围 | 参数数据包较小 | 大小皆可可传文件 | 同上 | 大小皆可,不可传文件 | 无 |
适用场景 | 常规远程服务方法调用 | 同上,另外可与rmi原生服务互操作 | 同上,可与hession原生服务互操作 | 需同时给程序以及浏览器使用的服务 | 系统集成,跨语言调用 |
Dubbo 实现原理:
解析服务->暴露服务->引用服务->拦截服务
远程调用过程:
从serviceConfig->ref(对外提供服务的实际类)->proxyfactory(代理工厂)->invoker(调用器)->protocol(对应协议)->exporter(输出)
消费服务过程:
指定关键字前后 10 行的日志查看(grep -A 10 -B 10 ‘keywords’ file.log)
堆栈怎么导出(jps -> jheap,jstack -> MAT)
Int 多大字节(4)
单例模式 (最优,双重检查,volatile关键字+静态方法内同步锁,静态内部类,利用类的初始化保证线程安全.枚举)
一个主线程,三个子线程,其中一个 OOM,其他线程状态(不论是堆oom(共享) 还是栈(私有) OverStackError 都不会影响到其他线程,当前线程会停掉,占用的内存会释放,如果不能回收,其他的线程也有可能 oom,主线程 oom 了如果子线程不是 daemon 则不会有影响,是 daemon 则会随主线程一起退出)
如何分析堆里的未回收的对象,线程死锁
如何加载远程机器的类(一般动态加载类都是直接用Class.forName()这个方法,URLClassLoader提供了从文件目录,jar包,http的加载.)
美团(基础架构)
TCP 如何保证可靠
线程池模型
YGC 流程
NIO 和 IO 区别,IO 多路复用
锁类型,乐观锁缺点
输出字符串最长连续子串
线程池模型,实现原理,shutdown 策略
死锁条件,如何避免
JVM 内存模型,哪些是线程私有
美团(广告)
Redis 分布式锁,加锁,释放如何保证原子性,主从切换如何保证成功(多台机器加锁,一半成功即可)
幻读和可重复读区别
事务隔离级别
HashMap,ConcurrentHashMap 底层结构,树化值
有序链表合并
链表相交检查
Java 锁,锁升级
Synchronized 实现原理
索引失效
索引原理
腾讯(深圳微视)
秒杀设计
分库分表
java8 特性
接口、抽象类区别
JUC 底层数据结构
Pod连接过多问题处理
请求耗时问题排查
GC 监控、判断、发现、优化
TopK
堆栈导出命令
类加载器
TiDB 了解
分布式 ID算法
合并有序链表
生成有效的括号组合
白鼠毒药问题
爱奇艺(会员业务)
MySQL 高可用实现,容灾
JDK 版本特性
消息队列使用场景
锁的使用
服务发现机制
高德(高精地图)
HashMap 为什么不安全(1. 并发值覆盖 2. Resize 死循环)
volatile 和 AtomicInteger 区别(volatile 保证内存可见性,原子性仅限于变量的读和写,无法涵盖变量的操作,如 count++;Atomic 底层依赖 unsafe,通过 CAS 乐观锁操作内存地址,保证原子性)
CAS(Compare And Swap 实现原理)(使用 Unsafe 操作内存地址,利用给定的值比较,保证原子性)
自旋锁会不会失败(会,值改变了)
MySQL索引原理
幂等实现方式(唯一索引、TOKEN、悲观锁、乐观锁、分布式锁、状态机)
SpringMVC 请求执行的流程(DispatcherServlet -> 处理映射器 -> 拦截器、过滤器-> 处理适配器 -> 处理器 -> 视图解析器 -> 视图 -> DispatcherServlet -> 响应)
快排
链表翻转
A、B 服务,A 可以访问外网,B 通过 A 访问外网,有哪些设计模式可以实现
mq怎么做到消息可靠(重试,落盘,ACK,幂等)
mq架构
表join算法(MySQL 34 讲)
调用Notify唤醒,先唤醒线程还是先执行后续代码(notify 不释放锁,执行完后续代码后才会释放)
高德(大数据)
服务架构
Qps,服务器配置
分布式锁
分布式事务
两个较大的数求和(转 Stirng 再求和再转数值)
兔子繁殖问题(递归思想,保存已求和的值)
链表翻转思路(遍历翻转,原地递归方式翻转)
JVM 内存结构(本地方法栈,虚拟机栈,程序计数器,元数据区,堆)
限流算法
ThreadPoolExecutor#execute执行流程(1. 核心线程池是否已满,未满创建核心线程,2. 已满则检查队列是否满,未满加入队列 3.队列已满则检查是否达到最大线程,未达到,创建新的线程,已达到,执行拒绝策略)
个人亮点
快手(客服平台)
Redis zset 底层结构(跳表)
GC 调优
Old 区回收原因,解决方案
MySQL 隔离级别,索引结构,B+树优点
TCP 三次握手,中间状态
Java 的锁
Socket 状态查询
数字交换一次位置,获取最大值(变成字符串,找到最后一个最大值,挪到最前面)
项目中的难点,解决方案
数据库双一设置(innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性的关键参数)
Redis String 底层结构(SDS 简单动态字符串)
用栈实现队列(s1,s2 两个栈,offer 到s1, pop的时候从s2 取,没有了把s1的弹出到s2)
线程池线程创建流程()
ES 结构,副本,角色
为什么要用线程池(1.提高 CPU 的使用率,2.异步执行提高响应)
MySQL执行流程,索引的作用
从日志统计用户的访问次数
小米(有品电商)
线程池线程模型
Hashtable 和 HashMap
二叉树的按层打印与ZigZag打印
派对的最大快乐值
自定义 String 如何加载,会不会冲突(类加载机制)
为什么要用双亲委派
Executors 创建的线程池类型
头条
TCP 三次握手,四次挥手
HTTP 方法,区别(GET,POST,PUT,DELETE,OPTION)
Redis 底层结构
GET 和 POST 的区别
InnoDB 索引,结构,覆盖索引,索引优点
Redis ZSET 底层实现,为什么不用红黑树
HTTP 状态码 301 302 区别
数字全排列,1234 的全排列
栈实现队列
外卖订单分库分表策略、方案
DFS 深度优先遍历
进程和线程的区别
进程状态
Boss 直聘
红黑树时间复杂度
二叉树最大深度
HashMap 结构
MySQL 索引
主线程和子线程协调(CountDownLatch)
Redis 分布式锁续期
Redis 线程,是否有多个