面试题[持续更新中]

架构之路[持续更新中]

Java

basic

  • 接口和抽象类的区别?
  • HashSet和HashMap的异同?
  • HashMap有哪些线程安全问题?
  • 如果HashMap(JDK 7)出现了死循环,该如何发现?
  • Map接口有哪些实现类
  • 讲一下LinkedHashMap?
  • HashMap的ReHash?
  • Hash冲突解决方式有哪几种?分别详细讲讲
  • ConcurrentHashMap 多机环境有什么问题么?
  • 除了Java自带的序列化之外,你还了解哪些序列化框架?
  • char数组与String有什么区别?两者安全性相比如何?
  • HashMap 1.7 segment分段锁 如果要找到具体的值,需要几次哈希?
  • String 和 StringBuild 以及 StringBuffer有什么区别?写一段代码证明String是不可变的

泛型

说一下你理解的泛型
在创建对象或调⽤⽅法的时候才明确下具体的类型。

注解

注解的@Rentention是什么意思?
@Retention注解传⼊的是RetentionPolicy枚举,该枚举有三个常量,分别是SOURCE、CLASS和RUNTIME。
SOURCE代表着注解仅保留在源级别中,并由编译器忽略。CLASS代表着注解在编译时由编译器保留,但Java虚拟机(JVM)会忽略。RUNTIME代表着标记的注解会由JVM保留,因此运⾏时环境可以使⽤它。

你有在编译期间处理注解相关的逻辑么?怎么处理?
需要继承AbstractProcessor 并实现process⽅法。lombok就用AnnotationProcessor继承了AbstractProcessor,来实现比如@Data相关的功能。

你在实际项目中用过注解吗?怎么用的?

注解的功能是怎么实现的?(反射)

JVM

  • JVM内存模型
  • jdk1.8垃圾回收有什么新的变化
  • GC的垃圾回收的原理,GC是怎么实现
  • gc 中新生代有两个 survivor 区,这两个 survivor 起到什么作用,为什么需要两个 survivor 区,如何调整大小
  • CMS 和 G1 之间的区别
  • 如何查看泄漏对象到 GC Roots 的引用链
  • 类加载的时机是什么?什么时候会触发类的加载?
  • 我们什么时候会考虑自定义类加载器?
  • Java虚拟机栈中的操作数栈的作用是什么?
  • 对象分配内存的时候会不会加锁?如果不加锁多个线程申请同一片内存?什么是TLAB?

多线程

  • Thread类实现了哪个接口?
  • 你知道如何根据一个类的定义来判断它是不是线程安全的吗?
  • Java中有哪些类型的锁?
  • (synchronized和ReentrantLock锁)如果一个线程得到了互斥锁,其他线程都在等待,那么这个线程释放锁之后,哪个线程可以得到锁?
  • ReentrantLock默认是公平的还是非公平的?
  • 如何得到一个线程安全的Map?
  • Java中有哪些锁?讲一下synchronized和ReentrantLock的区别?
  • 让 A 线程等待 B 线程有哪些措施
  • ReetrantLock 和 sychronized 关键字区别
  • 可重入锁的理解,Synchronized是不是可重入锁
  • 如何设计一个线程池?需要考虑哪些?

volatile

volatile 可见性原理?

被volatile关键字修饰的共享变量写操作在转换成汇编语言时,会加上一个以lock为前缀的指令,当CPU发现这个指令时,立即做两件事:

  • 立即将当前内核高速缓存中的数据回写到内存。
  • 同时使在其他内核里缓存了该内存地址的数据无效。(MESI缓存一致性协议)

解释一下MESI 缓存一致性协议

MESI(缓存一致性协议)的方法是在CPU缓存中保存一个标记位,这个标记位有四种状态:

  • M:Modify,修改缓存,当前CPU的缓存已经被修改了,即与内存中数据已经不一致了。
  • E:Exclusive,独占缓存,当前CPU的缓存和内存中数据保持一致,而且其他处理器并没有可使用的缓存数据。
  • S:Share,共享缓存,和内存保持一致的一份拷贝,多组缓存可以同时拥有针对同一内存地址的共享缓存段。
  • I:Invalid,失效缓存,这个说明CPU中的缓存已经不能使用了。

什么是指令重排?

从硬件架构上讲,指令重排序是指处理器采用了允许将多条指令不按程序规定的顺序分开发送给各个相应的电路单元进行处理。但并不是说指令任意重排,处理器必须能正确处理指令依赖情况保障程序能得出正确的执行结果。譬如指令1把地址A中的值加10,指令2把地址A中的值乘以2,指令3把地址B中的值减去3,这时指令1和指令2是有依赖的,它们之间的顺序不能重排——(A+10)2 与 A2+10显然不相等,但指令3可以重排到指令1、2之前或者中间,只要保证处理器执行后面依赖到A、B值的操作时能获取正确的A和B值即可。所以在同一个处理器中,重排序
过的代码看起来依然是有序的。【from 《深入理解JVM第三版》】

volatile禁止指令重排原理

happens-before原则,有一条表示:
volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作先行发生于后面对这个变量的读操作。

JMM提供四种内存屏障:

  • StoreStore屏障:禁止上面的普通写和下面的volatile写重排序
  • StoreLoad屏障:防止上面的volatile写与下面可能有的volatile读/写重排序
  • LoadLoad屏障:禁止下面所有的普通读操作和上面的volatile读重排序
  • LoadStore屏障:禁止下面所有的普通写操作和上面的volatile读重排序

Java对于volatile变量读写操作前后会插入合适的内存屏障:

  • 在每个volatile写操作的前面插入一个StoreStore屏障
  • 在每个volatile写操作的后面插入一个StoreLoad屏障
  • 在每个volatile读操作的后面插入一个LoadLoad屏障
  • 在每个volatile读操作的后面插入一个LoadStore屏障

volatile的优点

volatile 是一种非锁机制,这种机制可以避免锁机制引起的线程上下文切换。

volatile的缺点

volatile不能保证原子性。

手写一个双重检锁单例

手写一个枚举单例

I/O

BIO / NIO 的区别,如果 NIO 的 channel 一直为空,cpu 是否会飙高

NIO

传统IO是⼀次⼀个字节地处理数据,NIO是以块(缓冲区)的形式处理数据。
传统IO是阻塞的,NIO可以实现非阻塞。
在Java NIO有三个核⼼部分组成。分别是Buffer(缓冲区)、Channel(管道)以及Selector(选择器)。

Spring

  • Spring中的事务用过吗?讲一下
  • Spring AOP是怎么实现的?
  • 讲一下Spring的事务传播机制。
  • JDK动态代理和CGLIB有什么区别?既然有没有实现接口都可以用CGLIB,为什么Spring还要使用JDK动态代理?
  • Spring AOP不能对哪些类进行增强?(没有被Spring管理的类,当时没想出来)
  • Spring是怎么解决循环依赖的?多例对象之间的循环依赖?单例和多例之间的循环依赖?
  • Spring 在哪些地方用了什么设计模式
  • @EnableConfigurationProperties注解是干啥的?

IOC

控制反转,依赖控制,解耦,Bean声明周期管理,方便扩展。

AOP

底层技术是动态代理,内部实现依赖于Spring的BeanPostProcessor。

Bean的声明周期

  1. Spring启动时需要读取xml或者JavaConfig或者扫描注解。
  2. 解析xml或者JavaConfig,将bean信息封装成BeanDefinition,放到beanDefinitionMap(key->beanName,value->BeanDefinition)中。
  3. BeanFactoryPostProcessor修改BeanDefinition。(xml中的占位符,比如jdbc的${name},就是通过BeanFactoryPostProcessor的⼦类PropertyPlaceholderConfigurer进⾏注⼊)
  4. Bean实例化。
  5. 设置Bean属性。
  6. 判断该Bean是否实现了Aware相关的接⼝,如果存在则填充相关的资源。
  7. BeanPostProcessor before
  8. Bean的初始化(@PostConstruct -> 实现InitializingBean接口 -> xml中定义的init-method⽅法)
  9. BeanPostProcessor after
    10.使用
  10. 销毁(xml中定义的destroy-method -> 实现DisposableBean接口 -> @PreDestroy)

Spring循环依赖问题

Mysql

  • 讲一下数据库的三大范式
  • mysql的ACID特性分别是怎么实现的?
  • mysql的事务隔离级别是怎么实现的?
  • 脏读、幻读、丢失修改、不可重复读
  • 数据库的乐观锁悲观锁说一下,以及它们的使用场景
  • mysql innodb索引的数据结构
  • mysql事务的隔离级别?默认的是什么?
  • InnoDB锁算法或者锁机制?(Record lock/Gap lock/Next-key lock)
  • InnoDB 建表时,可不可以使用联合自增主键?primary key(name, id),id->auto_increment 可以么?
  • 索引用过吗?索引有什么缺点?什么时候适合用什么时候不适合?
  • 你通常怎么给一个表加索引?加索引的原则是什么?(最左前缀匹配范围查找、哪些字段适合建索引,哪些字段不适合建索引)
  • mysql数据库索引的原理
  • create index idx_table_column on table(column); 与 create index idx_table_column_id on table(column, id); 是否一致,如果不一致有什么 区别?
  • 为什么索引可以将随机I/O变为顺序I/O?
  • 复合索引,什么时候考虑建立复合索引
  • delete删除的数据,这条数据的存储空间会得到释放吗
  • mysql binlog 有几种写入格式,分别讲一下
  • 你知道的存储引擎有哪些,各个存储引擎之间有什么区别
  • 知道InnoDB的插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(ahi)、预读(read ahead)么?说一下你的理解
  • 大表优化[限定数据的范围/读写分离/垂直分区/水平分区]
  • 分库分表后主键id如何处理?[UUID/数据库自增 id/利用 redis 生成 id/Twitter的snowflake算法/美团的Leaf分布式ID生成系统]
  • binlog redolog undolog分别介绍一下,redolog是mysql的还是innodb独有的?有binlog为什么还要redolog?
  • 能讲一下磁盘的局部性原理么?时间局部性/空间局部性/顺序局部性。
  • 什么是磁盘预读?
  • 为什么会有意向锁?讲一下 IS Lock 和 IX Lock 的理解
  • 版本并发控制(MVCC)了解么?
  • 知道Oracle的默认隔离级别么?Mysql的默认隔离级别又是什么?
  • 讲一下Mysql中意向锁的作用
  • Gap Lock 是sql的还是mysql的还是innodb的?
  • 讲一下自增锁,innodb_autoinc_lock_mode,如果两个事务各批量插入100条数据。自增id是什么样的?如果自增列设置数据类型是int 当超过2^32会发生什么?[有唯一索引/没有唯一索引两个角度]
  • 行锁到底是锁的什么?
  • 如果不声明创建主键会有哪些危害?
  • 如何查看被优化器优化后的sql? explain -> show warnings;
  • 通过什么命令或者语句可以查看mysql支持的存储引擎? show engines;
  • innodb 系统表空间与独立表空间区别?
  • 给表加读/写锁的sql语句[表锁]? lock table [table] READ/WRITE;unlock tables;[释放锁]
  • 加行锁读写锁 ? lock in share mode; for update;
  • 能不能给一条没有索引的行加表锁?
  • 用过mysql的保存点么?savepoint
  • 有没有看过mysql的慢查询日志?如何开启mysql慢查询日志?如何看是否开启了慢查询日志?你看分析慢查询用什么工具么?
  • 讲一下页的分裂和合并
  • 一张表三个字段,name,email,phone,其中name跟phone有重复数据,怎么把重复数据删除?写sql

Mybatis

  • JDBC具体步骤?[导入驱动包->通过DriveManager注册驱动->创建连接->创建statement->CRUD->操作结果集->关闭连接]
  • MapperRegistry 是什么?
  • 将一下你理解的SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession
  • xml文件是怎么跟mapper关联的?mapper中的方法是怎么与xml 标签哪个属性映射?
  • mybatis是怎么找到xml文件的?mapper映射器
  • MapperRegistry 使用Class文件注册绑定需要注意什么问题?[接口与xml必须同名,接口和xml必须在同一个包下]
  • RowBounds分页原理是什么?pageHelper分页原理是什么?
  • #{} 与 ${} 有什么区别?
  • 讲一下一级缓存与二级缓存,一级缓存在使用中有什么问题?二级缓存在使用中有什么问题?

Redis

  • redis一般用它来做什么?
  • redis常用的数据类型,以及每种数据类型的使用场景,Redis 内部结构
  • redis写一个kv是原子的吗?什么是原子性。
  • redis持久化是怎么做的?有几种持久化方式?默认持久化方式?对比优缺点,如何选择
  • redis 的 cluster 模式如何进行通信,redis 中新增节点时的 slot 重新分配
  • redis的过期策略都有哪些?
  • 了解redis的淘汰策略么?
  • 讲一下缓存穿透,缓存击穿,缓存雪崩
  • 10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户?
  • 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?
  • 如何自己实现一个redis,要求能处理300qps

zookeeper

  • zookeeper应用场景
  • zookeeper是基于哪种算法实现分布式一致性的?
  • zookeeper在进行选举的过程中能提供服务么?如果能,说一下如何保证的?如果不能,说一下如何解决

MQ

  • 如何保证MQ顺序消费[rabbitmq如何保证,rocketmq如何保证,kafka如何保证]
  • 消息堆积这种情况如何处理?

Kafka

  • kafka 的消息的顺序一致性如何保证
  • kafka 的消息可靠性如何保证
  • kafka 的 controller 选举和 leader 选举
  • Kafka如何广播消息?Consumer group
  • Kafka 如何保证数据高可用?副本,ack,HW
  • 解释ISR、AR、HW、LEO、LSO、LW
  • 如何判断副本是否应该属于 ISR? [Follower 副本的 LEO 落后 Leader LEO 的时间,是否超过了 Broker 端参数 replica.lag.time.max.ms 值。如果超过了,副本就会被从 ISR 中移除。]
  • Producer 如何保证数据发送不丢失?
  • 什么情况会触发follower副本的同步请求?什么时候向leader副本拉取数据?
  • 什么情况副本会失效?是谁监听副本的失效?是谁负责从ISR中移除失效的副本?
  • producer向broker发送消息的流程?拦截器->序列化器->分区器是否了解?它们之间的处理顺序是什么?
  • producer怎么知道某个partition的leader是谁?
  • kafka的消息压缩算法能讲一下么?
  • 消费者消费消息,自动提交offset,如果提交完后consumer宕机了,怎么搞?如果把自动提交关了,等consumer消费完了之后提交offset,当consumer消费业务处理完了之后宕机,此时还未提交offset怎么处理?
  • 能说一下kafka中关于segment的概念么?
  • 为什么kafka能保证这么高的吞吐量?[生产者批量发送/压缩]
  • kafka为什么这么快(高性能)?[分区/顺序读写/pageCache/MMFile(Memory Mapped File)/分批发送/零拷贝/消息压缩/高性能二进制序列化/无锁offset管理]
  • kafka是如何保证顺序读写的?
  • ProducerRecord 中的时间戳是干嘛用的?CreateTime?LogAppendTime?
  • Leader副本所在节点会记录所有副本的LEO,Leader副本是什么时候记录follower副本的LEO的呢?
  • 请讲一下leader与follower副本同步过程
  • 讲一下Kafka消费者重平衡机制
  • 什么时候会触发消费者ReBalance?[组消费者成员发生变化/订阅主题数发生变化/订阅主题的分区数发生变化]
  • ReBalance有什么问题么?在重平衡期间,消费者是否可用?
  • Kafka为什么不支持读写分离?[数据一致性问题/延时问题]
  • kafka发送消息的三种方式?[简单/同步/异步]
  • 分区策略有哪些?如何自定义分区策略?
  • 消费者组的意义?[reBalance/多应用全量消息]
  • 两个订阅相同topic的消费者组,其中一个消费失败触发重试,另一个消费者组会不会重复消费?如何保证不会重复消费?
  • 如果消费者组中的其中一个消费者挂了,会发生什么?
  • Consumer是单线程么?[pull/心跳]
  • Kafka 的 Consumer 客户端是线程安全的么?[不安全,单线程消费,多线程处理] 如何保证线程安全?[Reactor模型]
  • 消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?[offset+1]
  • kafka消息保留策略知道么?[时间/文件大小]
  • 讲一下你对kafka流处理(聚合/统计)的理解?
  • 目前kafka某主题8个分区,我能修改成16个么?我能修改成4个么?
  • zookeeper在kafka中的作用?[broker注册/topic注册/生产者负载均衡/消费者负载均衡/集群管理/元数据管理]
  • 谁负责管理 flower 与 leader 之间的数据同步?[Broker内部ReplicaManager服务]
  • 重试机制会不会影响kafka顺序?怎么解决?
  • 讲一下Consumer群组协调器与再均衡监听器两个概念
  • Consumer自动提交会有什么问题?手动提交分为哪几种方式?[同步/异步/同步和异步/自定义提交]说一下自定义提交的理解
  • Consumer一次消费多条消息,但其中某条消费失败异常,这时候怎么保证不会消息丢失?顺便讲一下Kafka的事务处理
  • 创建主题的时候,参数–replication-factor 能不能大于broker数量?[不能]
  • Producer和Consumer在send或者pull之前会先从broker中获取元数据,并且这些元数据会缓存在客户端,如果broker某台机器宕机,并重新选举leader后,这时候缓存的数据可能就不准确,这时候会出现什么问题?该怎么处理?[broker会返回异常]
  • 知道kafka超时数据清理、数据压缩机制么?
  • 不完全的Leader选举? unclean.leader.election参数的作用是什么?
  • Kafka在哪处用到了零拷贝?页面缓存是什么意思?
  • 如果controller所在的broker节点宕机了,zk是怎么知道并删除相关节点(broker/ids/controller)的?[Broker 与 ZK会话结束,znode自动删除]ZK又是怎么通知kafka的?[watch]
  • 讲述FetchRequest RequestBody中session_id、epoch、forgotten_topics_data三个域的作用

Elasticsearch

  • 介绍下ES的分布式架构设计

Linux

  • hexdump用过么?
  • nc 命令用过没?[nc www.baidu.com 80]
  • 显示与IP、TCP、UDP和ICMP协议相关的统计数据,检验本机各端口的网络连接情况需要什么命令?[netstat]

Maven

  • nexus私服会搭建么?如何将本地maven上传到nexus私服?具体步骤

线上排查

  • 如何排查内存溢出现象?
  • 如果我有一个 http 的 api 方法,这个方法突然执行耗时较平时长,可能存在的问题,如何进行排查

计算机网络

  • 讲一下TCP三次握手/四次挥手,为什么要三次握手/四次挥手?
  • 网络协议分别是哪层
  • 网卡中的数据如何被加载到内存中
  • Https使用哪个端口?[443]

计算机操作系统

算法与数据结构

  • 100G 的数据文件存有字符串,找出出现次数最多的字符串,限制内存使用量为 4G
  • 设计一个能产生随机数的算法,并且产生的随机数必须是之前并没有出现的
  • 如何判断链表有环?怎么找出来 ?最短时间复杂度怎么做?
  • 找到链表的三等分点,需要考虑链表有环情况
  • 从10万个数中找最小的10个,时间复杂度分析(最大堆,考虑内存)
  • 从一个有正有负数组中找连续子数组的最大和,时间复杂度分析(动态规划)
  • 满二叉树第i层有多少个节点,n层的满二叉树共有多少个节点
  • 64匹马,8个赛道,找最快的4匹马
  • 给出两个升序数组A、B和长度m、n,求第k个大的
  • 给出数组A,长度为n,数组中元素的值位于[0, n - 1]之间,求是否有重复元素
  • 讲述滑动窗口原理,手写代码实现

其他

  • 最近一家公司做了哪些事情,有哪些挑战
  • 工作有哪些亮点,解决了哪些技术问题,有没有提升过系统性能
  • 什么是时钟回拨问题?如何解决?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值