常见问题

发布时间 2023-06-19 01:19:59作者: MarkLeeBYR

2.JAVA

2.1、基础


1、hashmap,hashtable的区别?hashmap数据结构?
concurrentHashMap数据结构,是如何保证线程安全的?1.7 1.8两个版本的实现区别 ?
concurrentHashMap是如何扩容的?是通过什么方式保证获取的size准确?
hashmap在1.7的时候有什么问题,【循环链表问题,丢数据问题】 ,如何解决这两个问题? 头插法变成尾插法
hashmap为什么链表长度大于8会变成红黑树,基于什么考虑的?
为什么hashtable,currentHashMap的key和value不能为空?
2、arraylist ,linkedList插入哪个更快,还有其它区别吗?,分别是如何扩容的?
3、volatile 这个关键字能保证什么? volatile i ; i++ 线程安全吗? 
4、synchronized ,reentrantLock 区别是什么?锁的释放,公平锁,获取锁的时间可控
6、CAS 是什么? JUC包下的unsafe干什么用的?
7、AQS是什么,实现原理?

2.2、JVM


1、jvm如何判定一个对象是垃圾对象,通过什么方法?GcRoots
2、jvm的垃圾收集算法有哪些? 分代收集是什么意思,年轻代是怎么换分的 Eden,from ,to?垃圾收集的过程?
3、cms垃圾收集器收集垃圾的阶段分为哪几个,哪个阶段会进行stop the world?
4、常见的jvm参数有哪些?你们公司的参数是怎么设置的?如果给你一个32G的内存机器,你如何设置堆大少,为什么?
5、类加载的过程? 对象创建的过程?
7、双亲委派模型讲一下,为什么要这么设计?
8、jdk 1,7 jdk 1.8 在内存换分上有什么变化?元空间、永久代 ,如何监控堆外内存?gperftools https://www.cnblogs.com/gnivor/p/11719958.html
9、java的内存划分有哪几部分,每个部分用来干什么的,线程独享吗?哪部分会内存益出,如何构造一个内存溢出的场景?内存益处如何解决? 什么是内存泄漏?与内存益出的区别?
10、G1垃圾收集器简单讲一下? 为什么它的停顿时间是可空的?
11、java的内存模型?工作内存,主内存,volatile修饰的直接操作主内存
12、什么是软引用、弱引用? 在垃圾收集时的处理方式?软引用:有用但非必须的对象,第二次进行回收,弱引用:垃圾收集时不管内存是否够用,都会进行回收
13、讲一下synchronized里锁有哪几种?锁是如何升级的?
14、public synchronized static method(){}和public synchronized method()有何区别?
15、一个线程OOM后,其他线程还能运行吗?还能运行,其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存。因为发生OOM之前要进行gc,就算其他线程能够正常工作,也会因为频繁gc产生较大的影响。

16、指针压缩  计算new object所占内存。32位和64位机器区别。

17、锁的粗化、锁消除

2.3、IO


1、bio 与nio的区别?
https://www.jianshu.com/p/9508220fa98c
https://blog.csdn.net/yjp198713/article/details/79320011
2、netty相关?
3、c10k问题如何解决?
4、同步、异步、阻塞与非阻塞

2.4、线程相关


1、多线程的优缺点?
2、进程与线程的区别?
3、进程间如何进行通信?
4、threadLocal可以解决什么问题,如何实现的?
5、线程池的实现原理?系统会建立几个线程来执行任务,避免线程的重复创建过程,减少资源消耗。
6、线程的池的关键参数?核心线程数、最大线程数、keepAliveTime:(最大线程数—核心线程数)线程存活时间,workQueue:任务队列,用来做缓冲作用
7、线程池执行任务的过程?
8、线程的状态?新建状态、就绪状态、运行状态、阻塞状态、死亡状态
9、什么是线程安全,你对它的理解?如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。
10、什么是死锁,如何避免死锁,能否写出一个死锁的程序?
11、线程池有2个核心线程,如果3个任务要被执行,如何线程1、线程2一直执行,这样会有什么问题?任务3一直不会被执行

2.5、设计模式

1、代理模式与装饰模式的区别,可以互换使用吗?

  • 从语意上讲,代理模式是为控制对被代理对象的访问,而装饰模式是为了增加被装饰对象的功能

  • 代理类所能代理的类完全由代理类确定,装饰类装饰的对象需要根据实际使用时客户端的组合来确定

  • 被代理对象由代理对象创建,客户端甚至不需要知道被代理类的存在;被装饰对象由客户端创建并传给装饰对象

2、线程安全的单列如何实现?可以手写?
3、生产者、消费者模式手写?
4、你在工作中用到了哪些设计模式介绍一下?
5、读过哪些源码,xx中用到了哪些设计模式?
6、设计模式的6大原则?开闭原则、迪米特法则(最少知道原则)、接口隔离原则、依赖倒置原则、里氏替换原则、单一职责原则
7、说出几个在JDK库中使用的设计模式?
装饰器设计模式(Decorator design pattern)被用于多个Java IO类中。单例模式(Singleton pattern)用于Runtime,Calendar和其他的一些类中。工厂模式(Factory pattern)被用于各种不可变的类如Boolean,像Boolean.valueOf,观察者模式(Observer pattern)被用于Swing和很多的事件监听中。

3、操作系统 & 通信

3.1、操作系统


1、linux 查看上下10行 cat error.log | grep -C 10 'nick'
2、vim 与less的区别 ?对于大文件的处理,要用less,vim会读取文件所有,很可能导致系统死掉
3、什么是mmap? 零拷贝? page cache ?
4、select ,poll ,epoll 区别?

5、linux的IO模型  阻塞  非阻塞 (select轮训) IO复用  信号驱动   异步  java io  bio/nio/aio

 

3.2、通信相关


1、tcp 与udp的区别?
2、http与https有啥区别?说下https解决了什么问题,怎么解决的?说下https的握手过程。
3、http1.0和http2.0的区别?
4、tcp的三次握手 与四次挥手过程,为什么要三次握手?
5、tcp协议的滑动窗口具体是怎样控制流量的?
6、http的状态码有哪些?502是什么,503是什么,403是是什么?
7、tcp怎么保证有序传输的,讲下tcp的快速重传和拥塞机制

8、tcp拆包 粘包问题  negal算法


4、数据库MySQL


1、mysql的索引有哪几种? 聚集索引与非聚集索引的区别? 什么是全文索引?B+ Tree索引和Hash索引区别?
2、 a b c 3个字段的联合索引什么用到哪个?最左原则
3、什么是覆盖索引,覆盖索引可以的优势是什么?避免回表
4、你是怎么理解索引的,mysql索引的数据结构?为什么选则b+树?
5、mysql的存储引擎有哪些? 区别?
6、mysql的数据库隔离级别有哪几个,默认的是哪个?每个隔离级别解决的是什么问题? 如何解决幻读?幻读与不可重复读的区别?
7、mvcc的做用,如何实现的?
8、mysql的锁有哪些?行锁、表锁、悲观锁、乐观锁、间隙锁,悲观锁和乐观锁的区别?
悲欢锁,每次去拿数据都认为别人会修改数据,所以每次都加锁,
乐观锁,每次拿数据时认为不会修改数据,所以不会上锁,但提交时会判断在此期间是否有其它人修改了数据,通常用version实现
9、手写一个死锁的代码?
10、mysql的主从数据同步的方式,如何保证数据的一致性?
11、mysql的事物特性有几个?ACID ,隔离级别有哪几个?
12、undo 、redo、 binlog 日志都是干什么的,有什么作用?
13、如何进行分库分表,常用中间件?mycat 、sharding-jdbc 等
14、你们创建的那么多索引,到底有没有生效,或者说你们的SQL语句有没有使用索引查询你们有统计过吗?如何看索引是否生效?mysql的执行计划
那什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢?查询优化器放弃使用索引,sql中有放弃索引的语句,比如like %""%等
15、mysql主键设计原则? 数字,有序 ,为什么要是数字和有序,基于什么考虑的?
使用非自增的主键,为什么要比自增主健耗时,耗时在哪里?要将新的索引插入到已有索引位置,需要进行数据的移动,频繁的数据移动增加磁盘io次数,主要耗时在这里
https://blog.csdn.net/itworld123/article/details/103004407
https://juejin.im/post/5e9d73ef51882573b86fa491

16、如果并发情况下有两条一样的数据插入数据库如何处理?用数据库的联合主键
17、select * from table where a = 10 and b>20 如何建立索引?建立 a,b的联合索引 ,https://zhuanlan.zhihu.com/p/48981451 所有关于建立索引的方式
18、如何做sql优化?加索引、去掉无用字段的返回,避免全面扫码,使用覆盖索引
19、了解mysql的回表吗?如何避免回表?查询时都是查询的主键的索引,然后在根据主键索引查询,这样就操作就是回表,在要查询的数据上建立了索引,这样就不需要进行回表查询了,例如: select name from table where name = zhangsan ,在name上建立索引
20、MySQL千万级数据量表update操作如何处理? 使用脚本更新,update and sleep ,选择在低峰期更新

21、MySQL中where 1=1会影响性能么,为什么?https://blog.csdn.net/shouchenchuan5253/article/details/104021767

 

5、缓存Redis


1、redis的常见数据结果有哪些?你们怎么使用的?
2、zset低层是怎么实现的?跳跃表,讲一下?
3、redis的内存回收策略?lru 、ttl等 http://www.justdojava.com/2019/11/16/redis-memory/
4、redis过期key的删除策略?惰性删除、定时删除 http://www.justdojava.com/2019/11/16/redis-memory/
5、redis的持久化方式有哪几种,区别?
6、讲讲redis的数据丢失与不一致?1,主从同步网络异常,抖动 ,从服务器与主服务器数据不一致;2,用aof持久化时,会有数据的丢失
7、keys * 命令存在的问题?有替代方案吗?
8、redis为什么快?单线程,无内存切换,纯内存操作,io多路复用,一个线程可处理多个连接
9、redis主从数据同步的过程?
10、redis的高可用? sentinel如何进行选主的?
11、redis的集群讲一下,集群间是如何通信的,通过什么协议? 如何从机器挂了如何进行选主?
12、实现一个积分排行榜 ,展示前1000名用户的积分?
13、redis如何实现分布式锁?set是原子操作吗?删除锁怎么保证原子性?锁的续期如何做?
14、缓存穿透概念?如何解决? 查询到db里不存在的数据,把空值放到缓存里,并且设置过期时间
15、缓存击穿概念? 如何解决?对于一些设置了过期时间的key,如果这些key(热点数据)可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存击穿和缓存雪崩的区别在于缓存击穿是针对某一key(热点数据)缓存,缓存雪崩则是很多key(非热点数据,但同时失效)。
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。使用互斥锁,只有一个线程到db获取数据,使用定时任务对key进行续期
16、缓存雪崩概念?如何解决?key采用了同样的过期时间,缓存在同一时刻失效,为过期时间加一个随机值
17、如何处理的大key问题?分拆
18、缓存数据一致性问题,如何解决? 先更新db在删除缓存,为缓存设置一个过期时间,这样在一段时间内可能会造成数据不一致,过期缓存就消失了。
19、redis里的hash是如何实现扩容的,和java里的hashmap有什么不同?

20、redis集群的三种方式 优缺点  主从  哨兵  分片

https://mp.weixin.qq.com/s/M9ImkchlYfB5yc7chJs0uQ  ,关于redis的总结

6、分布式相关


1、分布式中 cap是什么? 为什么不能同时保证?
2、 base是什么?


6.1、分布式协调zookeeper


1、zk中保证了cap里哪两个,为什么?
2、zk的做用是什么?分布式协调组件,可以实现分布式锁、读写锁、注册中心、配置中心等
3、zk如何实现分布式锁,有什么弊端,和redis的区别?
4、zk如何实现读写锁 ,过程简单介绍一下?比较难
5、zk为什么要部署奇数台?
6、什么是闹裂,zk如何解决闹裂的?
7、zk如何保证数据一致性的?客户端发起事物请求(增加节点,修改节点值、删除节点)操作,主节点会采用两阶段提交,先将数据发端给从节点,从节点进行写文件,写成功后并返回ack给leader。如果leader收到超过半数的从节点的ack,则在发送一条commid命令,从节点将数据写入内存
8、zk的是如何选主的,流程讲一下?在选主的过程中,可是否可用?
9、pasos选主算法是什么?zk使用的是什么选主算法或协议?zab
10、zk有哪几种节点?
        持久:创建之后一直存在,除非有删除操作,创建节点的客户端会话失效也不影响此节点。
        持久顺序:跟持久一样,就是父节点在创建下一级子节点的时候,记录每个子节点创建的先后顺序,会给每个子节点名加上一个数字后缀。
        临时:创建客户端会话失效(注意是会话失效,不是连接断了),节点也就没了。不能建子节点。
        临时顺序:不用解释了吧。
11、zk集群最少可以部署几台机器,为什么?
12、zk创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?
       连接断了之后,ZK不会马上移除临时数据,只有当SESSIONEXPIRED之后,才会把这个会话建立的临时数据移除。因此,用户需要谨慎设置Session_TimeOut

6.2、分布式事物


1、什么是分布式事物,为什么会出现 ,解决方案有哪些?
2、如何保证分布式事物的强一致性? 2pc、3pc   如何保证最终一致性?
3、二阶段提交、三阶段提交的过程?三阶段提交对二阶段提交做了哪些方面的改进?
4、分布式事物的TCC讲一下?
5、你负责的系统有没有分布式事物的场景,你是如何解决的?

6.3、分布式锁

1、为什么要有分布式锁,解决什么问题?
2、分布式锁的生成方式有哪几种?数据库,redis,zookeeper ,他们的区别是什么? redis如何释放锁、zoookeeper如何释放锁?
3、如果锁的过期时间是3秒,业务执行了5秒怎么处理?分布式锁如何做续期?
4、了解redis redlock吗,如何实现分布式锁的?
5、开源的分布式锁有哪些,有了解过吗?redisson ,它是如何做key续期的?

6、获取分布式锁的线程在执行业务的过程中如果发生了STW,会发生什么样的异常场景?

极端场景:STW后业务线程继续执行业务操作,但此时获取锁的线程已经释放了分布式锁,导致同一时间有两个线程在执行业务。

6.4、分布式ID

1、分布式id生成的方式有哪几种?db自增主键、redis的incr,美团开源的leaf ,做过对比吗,优缺点是什么?
2、什么是雪花算法?64位 0 +41时间 +10位机器 +12位序列号(自增) ,缺点:依赖机器时钟,时钟回拨会导致id有重复的可能
3、分布式ID的特性有哪些?

  • 唯一性:确保生成的ID是全网唯一的。

  • 有序递增性:确保生成的ID是对于某个用户或者业务是按一定的数字有序递增的。

  • 高可用性:确保任何时候都能正确的生成ID。

  • 带时间:ID里面包含时间,一眼扫过去就知道哪天的交易。 不是必须


7、限流&降级


7.1、限流


1、为什么需要接入限流?同一时刻提供服务的能力是有限的,当达到上限,server将被打挂,从而影响服务正常运行,引发线上事故。限流通过”扔掉消化不了的流量”,从而避免服务被打挂
2、开源的分布式限流组件有哪些?RatelimiterResilience4jSentinel、openresty、nginx
3、常用的限流算法有哪些?令牌桶、漏桶、滑动窗口,几种限流算法的区别是什么?
4、你的业务中有没有接入限流,了解其低层实现原理吗?


7.2、降级


1、为什么需要降级?降级是在下游服务出现异常时,服务调用方通过切换处理逻辑,向上继续提供无损/有损服务,保证业务柔性可用。
2、降级的分类?自动降级、手动降级 ,有损降级、无损降级。如缓存挂了查db是自动降级、无损降级,用户无感知。如会员系统挂了,需要手动降级,有损降级,用户有感知
3、常用的降级组件?hystrix
4、你们系统中是是否有需要降级的场景,如何做降级的?

8、MQ之kafka

1、kafka为什么快?

  • 顺序读写,消息是不端追加到文件的,顺序写

  • 零拷贝技术,不需要经过内核态,直接将内存地址发给网络缓冲区

  • 文件分段,topic被分为多个partition,每个paratition又分为多个segment

  • 批量发送消息,先将消息缓存在内存中,然后批量发送出去

  • 数据压缩,可以对消息进行压缩,减少消息大小


2、如何保证消息不丢失?
      2.1、在数据生产时避免数据丢失的方法:在同步模式的时候,确认机制设置为-1,也就是让消息写入leader和所有的副本。

  • 还有,在异步模式下,如果消息发出去了,但还没有收到确认的时候,缓冲池满了,在配置文件中设置成不限制阻塞超时的时间,也就说让生产端一直阻塞,这样也能保证数据不会丢失。


      2.2、在数据消费时,避免数据丢失的方法:
      如果使用了storm,要开启storm的ackfail机制;如果没有使用storm,确认数据被完成处理之后,再更新offset值。低级API中需要手动控制offset值。

3、消息重复了如何处理?

  • 去重:将消息的唯一标识保存到外部介质中,每次消费处理时判断是否处理过;

  • 不管:大数据场景中,报表系统或者日志信息丢失几条都无所谓,不会影响最终的统计分析结,具体看业务


4、kafka的作用?肖峰、填谷,异步,解耦

9、RPC之dubbo


1、dubbo有用过或了解吗,简单讲一下 ?有哪些端?服务消费都、服务提供者、监控中心、注册中心
2、dubbo的通信协议是什么?
3、dubbo的容错方式?
4、dubbo的调用过程、如果服务提供者下线了,如何通知消费者?
5、dubbo的序列化协议是什么?hessian ,还了解其它序列化协议吗?kryo、fst、protobuf ,thrift

6、dubbo的注册中心zk挂了,服务消费者能否继续工作?怎么保证的?


10、Spring


1、Spring IOC和AOP的原理?实现动态代理的方式?cglib,java动态代理,区别是什么?
2、SpringBoot源码解读,启动方式,配置顺序等
3、SpringMVC和Spring父子容器的关系
4、Spring的事务实现方式 事务失效的几种情况 特别注意 内部调用失效原因  事物@Transaction是基于AOP实现的功能增强  内部调用时并不是调用增强后的代理类 而是原始类
5、如何自定义实现SpringBoot中的starter
6、要想控制spring加载been的顺序,如何设置?使用Spring @DependsOn控制bean加载顺序

7、bean循环依赖问题  怎么解决的

11、mybaits


1、mybaits ORM基于什么思想 ?对象关系映射思想,把java的类和表名相对应,属性与不字段对应
2、mybaits缓存的淘汰机制 ? 二维缓存淘汰可选 lru lifo soft ,weak 默认是lru , mybaits缓存 一级 对应sesion,二级对就多个session

 

12、编译器优化

1、方法内联、冗余访问消除、覆写传播、无用代码消除。公共子表达式消除 数组边界检查消除   逃逸分析等

2、栈上分配  

 

13. 设计题

1、一个超大的单向链表,如上亿个节点,如何实现时间复杂度较低的排序

            1、分成一万份,每份1w个节点; 每个节点之后做归并;
            2、多线程,20个线程针对1万个节点做排序; 
                  2.1、1万个节点的排序是否能再加速
                  2.2、最后归并环节还是单线程实现的如何提速
           3、ForkJoin 框架

 

2、在mysql里有一个字段为url ,存放的是网页地址例如:htttp://baidu.com/sdrew/sdfsd.html ,如何快速查找到其中一个url ,数据量非常大

解法一、
增加一个字段url_id,此字段存储的为url对应的hash值,根据这个字段建立索引。在查询时根据url得hash值,在根据url_id查询记录,这样就能使用到索引了。

追问,那如果hash冲突了怎么办?可以设置url_id 惟一健约束,如何冲突,保存失败,此时 url+(截取一部份) 从新生成hash值 在保存

解法二、
保存到redis里,使用字符串保存,key为hashcode值,value为url,保存前先判断一下是否已经有值,有值说明冲突,如mysql解法一样,截取一部分在和url从新求hash值

追问,数据量比较大,如果避免大key问题?
截取url的前部分,例如http://baidu.com ,http://google.com 分别做key,这样就分散了 ,使用hash保存
key为http://baidu.com , hash表的key为url的hash值,value为url

 

3、 一个业务有几亿用户,实现一个积分排行榜。要求时时展示积分日榜、月榜、季榜 

 

4、设计一个电商系统。模块如何划分、DB如何设计、如何保证不超卖、系统间如何通信方式、如何降级、限流

 

5、IP库查找:
某IP库文件,一年更新一次,内容约100万行,格式如下:
起始IP 终止IP 地址
1.2.3.4 1.2.3.5 北京
123.123.123.123 200.200.0.0 上海
2.3.4.5 4.5.6.7 广州
1.2.3.7 1.2.3.9 北京
.......
要求设计出一个服务,给定IP,获取给定IP对应的地址,响应时间要尽可能的短
说明1:IP段是不重叠的,但是段和段之间可能存在空隙,既可能会有某个IP找不到对应地址的情况
说明2:地址范围为中华人民共和国行政区域内的地级市

 

 

前期准备:将ip转换为整数,将地址转换为对应的code,全国一共没有多少城市 ,比如北京1,上海2,节省空间。
思路:用redis的hashmap保存,将ip转换成一个整数【节省空间】,在对20取模,分为20段,记作key1.......key20 ,
存: 将ip转换的整数做为key ,城市的code对应为value 保存到redis的 hashtable里 ,
例如:hset key1,65535,1 , 解释:ip 122,122,233,15 对应的城市为北京
取:根据ip得到所在的端为哪个,在根据ip转换后的数字进行查找,找到对应的城市码