一、Redis
![](https://img-blog.csdnimg.cn/direct/d2ba637f4aa142438ff0212efd7ce2ef.png)
1. 使用场景
(1)Redis的数据持久化策略有哪些
RDB:全称Redis Database Backup file(Redis数据备份文件),也被叫作Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。
![](https://img-blog.csdnimg.cn/direct/9a0eb3839f66421db1aec136a2816c15.png)
RDB的执行原理?
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。fork采用的是copy-on-write技术:
当主进程执行读操作时,访问共享内存;
当主进程执行写操作时,则会拷贝一份数据,执行写操作。
![](https://img-blog.csdnimg.cn/direct/0407757bb64c4e53a3102ba54afff4d0.png)
AOF
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
![](https://img-blog.csdnimg.cn/direct/c979dba3ff424579b141cf45f442ae09.png)
![](https://img-blog.csdnimg.cn/direct/aff6266f7bd94b9fae9ce67b3dfd09a7.png)
![](https://img-blog.csdnimg.cn/direct/70ca12785916404fa3b3b14a01af791e.png)
![](https://img-blog.csdnimg.cn/direct/6cedfae191344017985e7a5cb6fa1559.png)
(2)什么是缓存穿透,怎么解决
缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
解决方案一:缓存空数据,查询返回的数据为空,扔把这个空结果进行缓存。优点:简单;缺点:消耗内存,可能会发生不一致的问题
解决方案二:布隆过滤器
![](https://img-blog.csdnimg.cn/direct/0f719f4d824c4bbcbd896831d6963028.png)
![](https://img-blog.csdnimg.cn/direct/ae704e71d5724089a1ecc6814b707199.png)
(3)什么是布隆过滤器
![](https://img-blog.csdnimg.cn/direct/db8be5fe0af3492b85a05f2541a87654.png)
误判率:数组越小误判率越大,数组越大误判率就越小,但是同时带来了更多的内存消耗。
优点:内存占用较少,没有多余key;缺点:实现复杂,存在误判
(4)什么是缓存击穿,怎么解决
缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮
![](https://img-blog.csdnimg.cn/direct/1eaf985b29ff4005a7764311f6670ae9.png)
解决方案一:互斥锁,强一致,性能差
解决方案二:逻辑过期,高可用,性能优,不能保证数据绝对一致
![](https://img-blog.csdnimg.cn/direct/ce63f6a63f9b4ba1bfdaca056f72b469.png)
(5)什么是缓存雪崩,怎么解决
缓存雪崩实质同一时间段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
![](https://img-blog.csdnimg.cn/direct/e7c9d07a9b0b4d9197aded39a2748a5b.png)
![](https://img-blog.csdnimg.cn/direct/28a4efe3201042cbb5f0fcfeb39205aa.png)
(6)redis双写一致性问题(redis作为缓存,mysql的数据如何与redis进行同步)
双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致
![](https://img-blog.csdnimg.cn/direct/b6b99e37599a43bcbe2cf1c1809c6548.png)
先删除缓存,还是先修改数据库?
![](https://img-blog.csdnimg.cn/direct/8680ba2799324c6f87bcac27977033f6.png)
![](https://img-blog.csdnimg.cn/direct/1fee35f97be7496eb842c57a8a7304a5.png)
![](https://img-blog.csdnimg.cn/direct/81e8c665b3674e1e997bdacb050deecd.png)
![](https://img-blog.csdnimg.cn/direct/b5e9498b934f4faebf2e3b7dc7e098f5.png)
![](https://img-blog.csdnimg.cn/direct/47ebbd22cb614109b5a4dcc70dd3b425.png)
(7)Redis分布式锁如何实现
![](https://img-blog.csdnimg.cn/direct/86b1db90649d444195fd4a2a95b18b90.png)
![](https://img-blog.csdnimg.cn/direct/355f0b62a2824020b4a5e31b2ed1974f.png)
![](https://img-blog.csdnimg.cn/direct/abb30bb01bfc4a8892724405f37b8f50.png)
![](https://img-blog.csdnimg.cn/direct/250bcd6a72374ca19da6c199d174b673.png)
![](https://img-blog.csdnimg.cn/direct/f22b86a801f347d9b21e2df598e2e106.png)
(8)Redis实现分布式锁如何合理的控制锁的有效时长
![](https://img-blog.csdnimg.cn/direct/d51fe8f1eb9e4aafa89629838c11b040.png)
![](https://img-blog.csdnimg.cn/direct/533c1e5693f84310ac28f487c0b69947.png)
![](https://img-blog.csdnimg.cn/direct/d0a8273509e543f0af7946830654139e.png)
![](https://img-blog.csdnimg.cn/direct/0664a082ff294506a73e40b71acca756.png)
![](https://img-blog.csdnimg.cn/direct/23f7fea2100d43fb922184e0247bf85b.png)
![](https://img-blog.csdnimg.cn/direct/d011297ef8594b13b8cf30b5989b4c81.png)
(9)Redis的数据过期策略有哪些
惰性删除:设置key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期,我们就删掉它,反之返回该key
![](https://img-blog.csdnimg.cn/direct/458535da100642e2a601517b4c8be248.png)
优点:对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查
缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放。
定期删除:每隔一段时间,我们就会对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行删除,并删除其中的过期key)。
![](https://img-blog.csdnimg.cn/direct/05cacf5bcd6645ed8c22c8639cab904f.png)
![](https://img-blog.csdnimg.cn/direct/e3ad76ca77dd41108f32cb88d618e776.png)
(10)Redis的数据淘汰策略有哪些
数据的淘汰策略:当Redis中的内存不够用时,此时再向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则则被称之为内存的淘汰策略。
![](https://img-blog.csdnimg.cn/direct/801c2d5f867a45b890dad94889ebb694.png)
![](https://img-blog.csdnimg.cn/direct/36706b90d54340f69ddd6179d89bc61c.png)
![](https://img-blog.csdnimg.cn/direct/85b017e7fa454281a967c849b1f7a6fa.png)
![](https://img-blog.csdnimg.cn/direct/ef0d3570ec7543489e2e7d9d7a9a84bc.png)
2. 面试题
(1)Redis集群有哪些方案
在Redis中中提供的集群方案总共有三种:
- 主从复制
- 哨兵模式
- 分片集群
(2)什么是Redis主从同步
单结点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
![](https://img-blog.csdnimg.cn/direct/982e03fb66f54d1894aa183d9e623cde.png)
![](https://img-blog.csdnimg.cn/direct/c5d5b359125646dd8f75b1d4cd18f616.png)
![](https://img-blog.csdnimg.cn/direct/0ae87b0520c04b5eb526633caf383f4c.png)
![](https://img-blog.csdnimg.cn/direct/80d5373aa3364098b7c4297055522896.png)
(3)哨兵的作用
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:
![](https://img-blog.csdnimg.cn/direct/a713e187d9a6494a84f0c0f06cc884fc.png)
![](https://img-blog.csdnimg.cn/direct/515470aec70e4ebe9722ab1cc5d3b814.png)
(4)Redis集群(哨兵模式)脑裂,该怎么解决?
![](https://img-blog.csdnimg.cn/direct/64fd3d5abeac4aa7a15a1d16d44961fe.png)
![](https://img-blog.csdnimg.cn/direct/075562832bd44f91ae6af689fe78b203.png)
(5)你们使用Redis是单点还是集群?哪种集群
![](https://img-blog.csdnimg.cn/direct/79b4fb8cf5704bea90532870602e1784.png)
(6)Redis分片集群中数据是怎么存储和读取的
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:
- 海量数据存储问题
- 高并发写的问题
使用分片集群可以解决上述问题,分片集群特征:
- 集群中有多个master,每个master保存不同数据
- 每个master都可以有多个slave节点
- master之间通过ping监测彼此健康状态
- 客户端请求可以访问集群任意节点,最终都会转发到正确节点
![](https://img-blog.csdnimg.cn/direct/1160bb8d094f43498922aeb9860dfba4.png)
![](https://img-blog.csdnimg.cn/direct/7fee826c1d544bcb9c1d7164b96a78ac.png)
![](https://img-blog.csdnimg.cn/direct/8035c1f8f34341559285c0354f9d6305.png)
![](https://img-blog.csdnimg.cn/direct/bab70d2b46644a0c8ac76fd50b40f155.png)
(6)怎么保证Redis的高并发高可用
(7)你们用过Redis的事务吗?事务的命令有哪些?
(8)Redis是单线程的,但是为什么还那么快?
![](https://img-blog.csdnimg.cn/direct/43cebba342244d1a968b034fbc926e16.png)
![](https://img-blog.csdnimg.cn/direct/5ff1f1eb056a47eb82f92e85af3d58d1.png)
![](https://img-blog.csdnimg.cn/direct/670ac98304eb42708907ae056ec9ef31.png)
![](https://img-blog.csdnimg.cn/direct/cb3e664148a74a59b04f58494b3ff385.png)
![](https://img-blog.csdnimg.cn/direct/c542c3b2765c4dd8a85a02663f84194b.png)
![](https://img-blog.csdnimg.cn/direct/74a468fdfcc040bf975e35e08d88b33b.png)
![](https://img-blog.csdnimg.cn/direct/d0763bf2ff8149888d92a306760f5ac1.png)
![](https://img-blog.csdnimg.cn/direct/4b5224a0a73144fda9fcb8e314aafcaf.png)
![](https://img-blog.csdnimg.cn/direct/fa2684888a064633be863763da9b4cce.png)
二、MySQL
![](https://img-blog.csdnimg.cn/direct/b170893d0ade4be1bca7b9a323f72ee0.png)
1. SQL优化
(1)在MySQL,如何定位慢查询?
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
表象:页面加载过慢、接口压测响应时间过长(超过1s)
方案一:开源工具
- 调试工具:Arthas
- 运维工具:Prometheus、Skywalking
![](https://img-blog.csdnimg.cn/direct/58629dca27d044db9fb1104b8c87a2b6.png)
方案二:MySQL自带慢日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
![](https://img-blog.csdnimg.cn/direct/d1cf3ff1069b4a19b3bff7c7acec2dea.png)
配置完毕之后,通过以下命令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息:/var/lib/mysql/localhost-slow.log
![](https://img-blog.csdnimg.cn/direct/54fb805bacc04b02b4ccda2090f04aa2.png)
![](https://img-blog.csdnimg.cn/direct/e5e4e3cd2a794fe7b26aa23eb47ed6e0.png)
(2)一个SQL语句执行很慢,如何分析
可以采用EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息
![](https://img-blog.csdnimg.cn/direct/340c7c80be0543beacb992b72bd3812c.png)
![](https://img-blog.csdnimg.cn/direct/b9b3f457ac304ef1b4184bc5efa7de70.png)
![](https://img-blog.csdnimg.cn/direct/718c89d4ccfd423faab305979c20233f.png)
![](https://img-blog.csdnimg.cn/direct/7e63c6286933442f9884855afef5f150.png)
(3)了解过索引吗?什么是索引?
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
![](https://img-blog.csdnimg.cn/direct/d373d4bd9e3b4ab4ba06271f3976e09e.png)
![](https://img-blog.csdnimg.cn/direct/885ec06f0e614802a7ab00e325efc9c5.png)
![](https://img-blog.csdnimg.cn/direct/3a1be4eb53504e7b98171eb8a5316450.png)
![](https://img-blog.csdnimg.cn/direct/358f143ff6b3424d97b6b0e8f61c0211.png)
![](https://img-blog.csdnimg.cn/direct/e6ba833ee3824a399139e5c70aef1e79.png)
![](https://img-blog.csdnimg.cn/direct/ac656cadf1ff4ed4990314dd5c6002db.png)
(4)什么是聚簇索引,什么是非聚簇索引?
什么是聚集索引,什么是二级索引(非聚集索引),什么是回表?
![](https://img-blog.csdnimg.cn/direct/56365e18c2f34b68ba87c9ad740a0785.png)
![](https://img-blog.csdnimg.cn/direct/9aa9facc9b4b45938c2167b437d28117.png)
![](https://img-blog.csdnimg.cn/direct/3854e2794df94216ae6aaa2cd82dca04.png)
在二级索引中找到name字段对应的主键值,然后再根据主键值到聚集索引中查找对应行数据。
![](https://img-blog.csdnimg.cn/direct/37828bf21e4243f8a3639025f7d3ed76.png)
![](https://img-blog.csdnimg.cn/direct/926d9d7022724aa6921cee2b56dfbf17.png)
(5)什么是覆盖索引?
![](https://img-blog.csdnimg.cn/direct/0964acf2eaf84fbab61cfce1906ce815.png)
![](https://img-blog.csdnimg.cn/direct/de0236b55ac44b609c267a960edea7d2.png)
![](https://img-blog.csdnimg.cn/direct/999dc981c10544aaac555a01d50ee16e.png)
(6)MySQL超大分页处理
在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。
![](https://img-blog.csdnimg.cn/direct/ea8b23d90b3d45e9989e789cabf00af2.png)
优化思路:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。
![](https://img-blog.csdnimg.cn/direct/6b7815d46c9a406890f19ce30239de54.png)
![](https://img-blog.csdnimg.cn/direct/16cbcaba84ea4d648013a1befe1683e9.png)
![](https://img-blog.csdnimg.cn/direct/55942844cfa94fc7973e6254f9aa5149.png)
(7)索引创建原则有哪些?
- 主键索引
- 唯一索引
- 根据业务创建的索引(复合索引)
①针对于数据量较大,且查询比较频繁的表建立索引 -> 单表超过10万条数据(增加用户体验)
②针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
③尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
④如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
⑤尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
⑥要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
⑦如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。
![](https://img-blog.csdnimg.cn/direct/976d0106f997435090977972590497e5.png)
(8)什么情况下索引会失效?
![](https://img-blog.csdnimg.cn/direct/a802a7abdd22425d86e0d8f910b5a40d.png)
![](https://img-blog.csdnimg.cn/direct/4c54641ba46a46aca08f814fdbda7f24.png)
![](https://img-blog.csdnimg.cn/direct/97eaae63c3a24bb39dc6254932d3fe38.png)
![](https://img-blog.csdnimg.cn/direct/b65c7205d01642c58585ccf18c0eed63.png)
![](https://img-blog.csdnimg.cn/direct/15a8661f2a004d3d927c72f2f105fa29.png)
![](https://img-blog.csdnimg.cn/direct/55d255970a304c35bf26228f6ea51e71.png)
![](https://img-blog.csdnimg.cn/direct/ec01c951b62043a49d503e72e293da34.png)
![](https://img-blog.csdnimg.cn/direct/0c13bf70a5b44dd3a7588d4ee9ceffa5.png)
![](https://img-blog.csdnimg.cn/direct/2a2e78c40fe5437ab61e8d3854625c5f.png)
(9)谈谈你对sql的优化经验?
- 表的设计优化
- 索引优化
- SQL语句优化
- 主从复制、读写分离
- 分库分表
![](https://img-blog.csdnimg.cn/direct/2ae39045e56d40c0b61a41cc9264f537.png)
![](https://img-blog.csdnimg.cn/direct/7efc97840a6d48a6a4208d63f2ee142b.png)
![](https://img-blog.csdnimg.cn/direct/9ee582bc9e534e7aae1ca013edd6d163.png)
2. 其他面试题
![](https://img-blog.csdnimg.cn/direct/ca582b7072994093910d02a760851c94.png)
(1)事务的特性是什么?可以详细说一下吗?
事务是一组操作的集合,它是越高不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么成功,要么同时失败。
ACID是什么?
![](https://img-blog.csdnimg.cn/direct/2bc36f6ee76f46cfa6b4b79c03af2720.png)
![](https://img-blog.csdnimg.cn/direct/d47e0cb927e54bf3b912d5c5e4c0a56d.png)
(2)并发事务带来哪些问题?怎么解决这些问题呢?MySQL的默认隔离级别是?
并发事务问题:脏读、不可重复读、幻读
隔离级别:读未提交、读已提交、可重复读、串行化
![](https://img-blog.csdnimg.cn/direct/5ca130997a1244459d0a4c652fa458ae.png)
解决方案:对事务进行隔离
![](https://img-blog.csdnimg.cn/direct/695e9aa411f2407eaffceef89bb0ee46.png)
注意:事务隔离级别越高,数据越安全,但是性能越低。
MySQL默认的隔离级别是Repeatable Read(可重复读)
![](https://img-blog.csdnimg.cn/direct/efac0a5dff3f4c2c8f2663cb7ea990b4.png)
(3)undo log和redo log的区别
![](https://img-blog.csdnimg.cn/direct/c0385c7f6c044b13b261755db180879a.png)
![](https://img-blog.csdnimg.cn/direct/e96afa7b234b4f4580d57a35a587cc7b.png)
![](https://img-blog.csdnimg.cn/direct/7acd9191dc904e6da175dfe55026f94e.png)
![](https://img-blog.csdnimg.cn/direct/3a8af417143b4cca86c4d8dd4b84b818.png)
![](https://img-blog.csdnimg.cn/direct/64ded2fd5bba46718455298c865c3fb8.png)
(4)解释一下MVCC -> 事务隔离性
全称Multi-Version Concurrency Control,多版本并行控制。指维护一个数据的多个版本,使得读写操作没有冲突。MVCC的具体实现,主要依赖于数据库记录中的隐式字段、undo log日志、readView读视图。
![](https://img-blog.csdnimg.cn/direct/4b38e85a00c446238c4a62e1f86f69bb.png)
- 记录中的隐藏字段
![](https://img-blog.csdnimg.cn/direct/b2fa0b918993493c8d6eded292b5e36f.png)
- undo log
![](https://img-blog.csdnimg.cn/direct/3a06fe3c8ffc4e56a8b49544ebe85310.png)
- undo log版本链
![](https://img-blog.csdnimg.cn/direct/fe078cd74d4045d9a82a81b60efd3bda.png)
- readview
![](https://img-blog.csdnimg.cn/direct/1c0b6eafca1b4258ab411d5d7507c5ec.png)
![](https://img-blog.csdnimg.cn/direct/c0141765d8954e5d9ab52bd40c692c26.png)
![](https://img-blog.csdnimg.cn/direct/0582430b282149789700f1d817842ec6.png)
![](https://img-blog.csdnimg.cn/direct/c6a7f85d13d0465c995e3296c76f3f07.png)
![](https://img-blog.csdnimg.cn/direct/ee26a2ae684c425282e0bf2466528277.png)
![](https://img-blog.csdnimg.cn/direct/f985c0de8bbd4f57a94c9eeb7708fb39.png)
![](https://img-blog.csdnimg.cn/direct/7022c2080b6f4347a90b89a601241b24.png)
(5)MySQL主从同步原理
![](https://img-blog.csdnimg.cn/direct/c031c56bf382457eb8f90a83eb2a3223.png)
![](https://img-blog.csdnimg.cn/direct/e7d6b456f02a4c339e5aa3b858b3531b.png)
(6)你们项目用过分库分表吗?
![](https://img-blog.csdnimg.cn/direct/bb3ce55628674bfb9c49b9f5a53d7998.png)
拆分策略:垂直拆分、水平拆分
垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
![](https://img-blog.csdnimg.cn/direct/6aefa2f9bff745cb8920a69901773d4f.png)
特点:
- ①按业务对数据分级管理、维护、监控、扩展
- ②在高并发下,提高磁盘IO和数据量连接数
垂直分表:以字段为依据,根据字段熟悉将不同字段拆分到不同表中。
拆分规则:
- 把不常用的字段单独放到一张表
- 把text、blob等大字段拆分出来放在附表中
![](https://img-blog.csdnimg.cn/direct/dadf6be6aeff4ab2be957b79d8a984e6.png)
特点:①冷热数据分离;②减少IO过渡争抢,两表互不影响
水平分库:将一个库的数据拆分到多个库中。
![](https://img-blog.csdnimg.cn/direct/540dd2000dfe406bad85908ad31b49bf.png)
水平分表:将一个表的数据拆分到多个表中(可以在同一个库内)。
![](https://img-blog.csdnimg.cn/direct/e800d3c40469481393da9a5d52d3ff5c.png)
![](https://img-blog.csdnimg.cn/direct/ec6de7521d664325980cbfc37fff8142.png)
![](https://img-blog.csdnimg.cn/direct/28831772362441208726e64a154c0147.png)
三、Spring
![](https://img-blog.csdnimg.cn/direct/7cb65d6bd37a40f58e0545cef9964c9d.png)
(1)Spring框架中的单例bean是线程安全的吗?
![](https://img-blog.csdnimg.cn/direct/fb525813c9d84b1999bbcf85e8d8a1dd.png)
![](https://img-blog.csdnimg.cn/direct/81c59a5e43d947beba2a5f5d2341e44e.png)
![](https://img-blog.csdnimg.cn/direct/373907bafdea4369ad6a268170e992bd.png)
![](https://img-blog.csdnimg.cn/direct/ce78eaf2a7ef45c5affeedc8bc12f877.png)
(2)什么是AOP,你们项目中有没有使用到AOP
![](https://img-blog.csdnimg.cn/direct/2d7944ab79374c13a068782d610e46e5.png)
![](https://img-blog.csdnimg.cn/direct/7d3f4f581fe544d08b96a83c0712c9cb.png)
(3)Spring中的事务是如何实现的?
Spring支持编程式事务管理和声明式事务管理两种方式。
![](https://img-blog.csdnimg.cn/direct/3be6d8bbfce34961b42f4370f290f5e2.png)
(4)Spring中事务失效的场景有哪些?
情况一:异常捕获处理
如果在一个事务方法内部捕获了异常并对其进行了处理,Spring事务管理可能无法感知异常的发生,从而导致事务失效。事务通知只有捕捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉。
![](https://img-blog.csdnimg.cn/direct/9d6d424bcc204d39a29342421545fc5a.png)
情况二:抛出异常
如果抛出的异常不是继承自RuntimeException,Spring默认不会回滚事务。所以,确保抛出的异常继承自RuntimeException或声明在方法签名中。
![](https://img-blog.csdnimg.cn/direct/5cfd410d89564b11ab16708d4ca8566a.png)
情况三:非public方法导致的事务失效
![](https://img-blog.csdnimg.cn/direct/16fec629187645af9f95cb371974051f.png)
情况四:未使用代理对象
Spring的事务管理通常通过代理对象来实现事务的增强,如果直接调用一个带有@Transactional注解的方法而不是通过代理对象调用,事务将不会生效。
情况五:编程式事务管理下,抛出异常未被捕获
在基于编程式事务管理时,如果一个带有@Transactional注解的方法内部发生但未被捕获,在异常传播至事务管理器时,可能导致事务无法回滚。
情况六:运行时异常未被声明
只有在方法声明的检查异常(checked exception)被抛出时,Spring 事务管理器才会触发事务回滚。如果抛出的是运行时异常,且未被显式声明在方法签名中,可能会导致事务未能正确回滚。
情况七:嵌套调用问题
在嵌套调用的情况下,事务的传播机制需要正确设置,否则可能导致外部事务失效或内部事务回滚不受控制。
情况八:多个事务注解嵌套使用
在某个方法上同时使用多个 @Transactional
注解,可能导致事务失效或者事务传播不符合预期。
![](https://img-blog.csdnimg.cn/direct/a0850dfac743404bb0675f313d22686b.png)
(5)Spring的bean的生命周期
![](https://img-blog.csdnimg.cn/direct/a7713cfde2d84604be3c0f41907c502b.png)
![](https://img-blog.csdnimg.cn/direct/08e2a5aec09649dba86cf771e8e513de.png)
![](https://img-blog.csdnimg.cn/direct/2350363791554cb78f67146ce37185e1.png)
(6)Spring中的循环引用
![](https://img-blog.csdnimg.cn/direct/99bdc0f9ecbe43929e61fcfd145b0f61.png)
什么是Spring的循环依赖?
![](https://img-blog.csdnimg.cn/direct/9805c8d3cf90444c8b143f05a6086d52.png)
三级缓存解决循环依赖
Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:
![](https://img-blog.csdnimg.cn/direct/36ac8ff2849c44c594ad435c3a98eadb.png)
一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖
如果要想打破循环依赖,就需要一个中间人的参与,这个中间人就是二级缓存
![](https://img-blog.csdnimg.cn/direct/e4d2364a66224e5d84f429f81d13b671.png)
![](https://img-blog.csdnimg.cn/direct/59ebb7515b9f4032b6c81da2547c5487.png)
![](https://img-blog.csdnimg.cn/direct/d541f5b38bce4ed59b57d18c3fff821f.png)
![](https://img-blog.csdnimg.cn/direct/877ba6daa9ce4ace977c6e3267d1a384.png)
![](https://img-blog.csdnimg.cn/direct/6294344cfec545f496d38f2b5169c7c2.png)
(7)SpringMVC的执行流程
![](https://img-blog.csdnimg.cn/direct/61ac0b468b6f479e945778af5496d915.png)
视图阶段(JSP)
![](https://img-blog.csdnimg.cn/direct/231dd1a33c01478f860e7d7100780bcb.png)
![](https://img-blog.csdnimg.cn/direct/b99b242dfe004a5ba84904cf37214cf1.png)
![](https://img-blog.csdnimg.cn/direct/7d35260dd3d74b52aed660232c6ab394.png)
![](https://img-blog.csdnimg.cn/direct/475e1cad404d42109ff107436cf01da2.png)
(8)SpringBoot的自动配置原理
![](https://img-blog.csdnimg.cn/direct/9d5355c846fa49069f983c9570b83490.png)
![](https://img-blog.csdnimg.cn/direct/eccc80896b2a4eb5b59775777e2717e1.png)
![](https://img-blog.csdnimg.cn/direct/69b8c60257e140a98ce938f4b10d7e5a.png)
(9)Spring框架常见注解(Spring、SpringBoot、SpringMVC)
Spring的常见注解有哪些?
![](https://img-blog.csdnimg.cn/direct/1ed4eb03b6bc4232b5d8e47f2537335a.png)
SpringMVC的常见注解有哪些?
![](https://img-blog.csdnimg.cn/direct/82fe46390adb4c8fa69ecfb4409937ba.png)
SpringBoot常见注解有哪些?
![](https://img-blog.csdnimg.cn/direct/7a405e0d87e644b2b5b5cda1a01083e0.png)
四、MyBatis
(1)MyBatis执行流程
![](https://img-blog.csdnimg.cn/direct/277a90623230404884bf556f66e8ce25.png)
![](https://img-blog.csdnimg.cn/direct/1154d62221c54247bec48c044b2f855a.png)
(2)MyBatis是否支持延迟加载?
![](https://img-blog.csdnimg.cn/direct/0e7da93d049f46eb9cb7d27320f6960d.png)
![](https://img-blog.csdnimg.cn/direct/9db349a9d45c4bf185ced70799df35ce.png)
![](https://img-blog.csdnimg.cn/direct/c7ac13600b7a4d57bacba228678c1fbe.png)
(3)MyBatis的一级、二级缓存用过吗?
![](https://img-blog.csdnimg.cn/direct/cba63301ebf447a9abbb1670d2c0db94.png)
一级缓存
一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。
![](https://img-blog.csdnimg.cn/direct/5aa0a62b030f4c5eac576fda7fcee81b.png)
二级缓存
二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储
![](https://img-blog.csdnimg.cn/direct/b9398163ef7842e3a90e8ca0de85ecd2.png)
注意事项:
- 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)进行了新增、删除操作后,默认该作用域所有select中的缓存将被clear
- 二级缓存需要缓存的数据实现Serializable接口
- 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中
![](https://img-blog.csdnimg.cn/direct/e2f273b27849436c919b05054170b874.png)
五、SpringCloud
![](https://img-blog.csdnimg.cn/direct/170bb7bc990a4063b5455d535a49e26f.png)
(1)Spring Cloud的5大组件有哪些?
![](https://img-blog.csdnimg.cn/direct/99a6213be34c406e9a1c91a91a6f8982.png)
通常情况下:
Eureka/Nacos:注册中心
Ribbon/SpringCloudLoadBalancer:负载均衡
Feign:远程调用
Hystrix/Sentinel:服务熔断
Zuul/Gateway:网关
![](https://img-blog.csdnimg.cn/direct/fbcbbcb42948440abc8f0dea1955474f.png)
(2)服务注册和发现是什么意思?Spring Cloud如何实现服务注册发现?
常见的注册中心:Eureka、Nacos、Zookeeper
![](https://img-blog.csdnimg.cn/direct/105eeb1e8a154c6a95d84387fb4dcc3a.png)
![](https://img-blog.csdnimg.cn/direct/03f70a4b18af4af0be46fad8b9e25c17.png)
![](https://img-blog.csdnimg.cn/direct/42ce4b4abd4149ca9ba20b8ce7d9b8ae.png)
![](https://img-blog.csdnimg.cn/direct/5d0b8194f72d462a8ad78ed3dfb9e53d.png)
(3)你们项目负载均衡是如何实现的?
![](https://img-blog.csdnimg.cn/direct/aa83f63de67747dfb3d9330fab5091d0.png)
![](https://img-blog.csdnimg.cn/direct/35554777da8b47d7831483cfb302b1e6.png)
(4)什么是服务雪崩,怎么解决这个问题?
![](https://img-blog.csdnimg.cn/direct/0e18c8c5b3fe45fcabd1423a8ff80fd1.png)
服务降级:是服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃
![](https://img-blog.csdnimg.cn/direct/996dbf4926c34170a5151b7ff2a393c7.png)
![](https://img-blog.csdnimg.cn/direct/cbdd6cae7bda417e82415940fc8e0df6.png)
服务熔断:Hystrix熔断机制,用于监控微服务调用情况,默认是关闭的,如果需要开启需要在引导类上添加注解:@EnableCircuitBreaker。如果检测到10秒内请求的失败率超过50%,就触发熔断机制,之后每隔5秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求。
![](https://img-blog.csdnimg.cn/direct/5434c3bb8d5040b39c5ad09def46d090.png)
![](https://img-blog.csdnimg.cn/direct/1f41adea1ea74cc78b2ee8ab5e9ea4fe.png)
(5)你们的微服务是怎么监控的?
![](https://img-blog.csdnimg.cn/direct/1f505a54a0c04725913853bfe39f2210.png)
![](https://img-blog.csdnimg.cn/direct/b0b3d2506be7485a8553197ba14688cc.png)
![](https://img-blog.csdnimg.cn/direct/ce73c228c20642c292c7278cb4f9c3fe.png)
(6)你们项目中有没有做过限流?怎么做的?
为什么要限流?
- 并发的确大(突发流量)
- 防止用户恶意刷接口
限流的实现方式:
- Tomcat:可以设置最大连接数
- Nginx:漏桶算法
- 网关:令牌桶算法
- 自定义拦截器
Nginx限流
- 控制速率(突发流量)
![](https://img-blog.csdnimg.cn/direct/3c93feee8ed24110b23a9394dd2b2bf9.png)
- 控制并发连接数
![](https://img-blog.csdnimg.cn/direct/fe27ef39a0af40649dd54cbc017d5ddd.png)
网关限流
yml配置文件中,微服务路由设置添加局部过滤器RequestRateLimiter
![](https://img-blog.csdnimg.cn/direct/9a4851881f2d4770b3985f585c283ff4.png)
![](https://img-blog.csdnimg.cn/direct/6c25092844dd4a74973d17913bba61a8.png)
(7)解释一下CAP和BASE
CAP定理
![](https://img-blog.csdnimg.cn/direct/f13c7af1b56b46a5bd02b0e8d440507c.png)
![](https://img-blog.csdnimg.cn/direct/075e6324e61348209e92d15ff306c1c3.png)
![](https://img-blog.csdnimg.cn/direct/16daf0c3efc841529da562c1643102dc.png)
![](https://img-blog.csdnimg.cn/direct/1298626284094fd482b22ec8bdd0ee82.png)
BASE理论
![](https://img-blog.csdnimg.cn/direct/e0c891f3ded247999432c175f54f7ab6.png)
![](https://img-blog.csdnimg.cn/direct/a0f33920790e4997b1d234585f16f70c.png)
(8)你们采用的是哪种分布式事务解决方案?
![](https://img-blog.csdnimg.cn/direct/5070bd9d09f54b65a81ffe16629de61e.png)
![](https://img-blog.csdnimg.cn/direct/9f904708ca4c4e82b8344ac1ef4f4726.png)
![](https://img-blog.csdnimg.cn/direct/d3a3c11814ec443e87da8b884c69a973.png)
![](https://img-blog.csdnimg.cn/direct/3dbf5c8e6a00444ab2c18887e27a135b.png)
![](https://img-blog.csdnimg.cn/direct/cd0a12b4bffe4db3a9e3fc244ea73a08.png)
![](https://img-blog.csdnimg.cn/direct/e8e14e468aa54797aabe46dbe7b34ec3.png)
(9)分布式服务的接口幂等性如何设计?
![](https://img-blog.csdnimg.cn/direct/dd605d1fdf7546fea68508a28728c296.png)
![](https://img-blog.csdnimg.cn/direct/1d6453d671e045c9a8a0df2901afaf4e.png)
(10)你们项目中使用了什么分布式任务调度?
![](https://img-blog.csdnimg.cn/direct/cd3e2fd8669843a9bb0acdcf74751773.png)
![](https://img-blog.csdnimg.cn/direct/78de3eaa0a8d442fb5d68a4e2ddfc278.png)
![](https://img-blog.csdnimg.cn/direct/38857e1adc8f44ddad613fe0e74c4f80.png)
![](https://img-blog.csdnimg.cn/direct/28aa98c5ad2c4723be269484e6855815.png)
![](https://img-blog.csdnimg.cn/direct/97034f946832485895bc456a54202dd9.png)
六、RabbitMQ
![](https://img-blog.csdnimg.cn/direct/89fa8bf7b24c405c9a65733d6c146283.png)
(1)RabbitMQ如何保证消息不丢失?
![](https://img-blog.csdnimg.cn/direct/d6a06f5d36384c19bdacf54d21132336.png)
![](https://img-blog.csdnimg.cn/direct/bea26b104d704aad96e5b3ae29af2855.png)
![](https://img-blog.csdnimg.cn/direct/40a8f0d0c07940c1978ca1982107a305.png)
![](https://img-blog.csdnimg.cn/direct/7b5d5bbef87d424db52c0155dd7613eb.png)
![](https://img-blog.csdnimg.cn/direct/1fb8ffa152824a34ad61bd6135d6bb06.png)
![](https://img-blog.csdnimg.cn/direct/ce6b4ef9ad224367abef642841f507de.png)
(2)RabbitMQ消息的重复消费问题如何解决?
![](https://img-blog.csdnimg.cn/direct/f306af700abe4b669146987e4175d7c0.png)
![](https://img-blog.csdnimg.cn/direct/c783b831733e4133aa84dda80e6ae6d9.png)
(3)RabbitMQ中死信交换机?(RabbitMQ延迟队列有了解过吗?)
![](https://img-blog.csdnimg.cn/direct/e0b68e3e2e0a46238159cec5a7587905.png)
![](https://img-blog.csdnimg.cn/direct/8d8c64a1d3e54076872e36dc700ace00.png)
![](https://img-blog.csdnimg.cn/direct/c9bbf840eafa4c6398c7b2ea46952a49.png)
![](https://img-blog.csdnimg.cn/direct/5b672c6b6e3747e7b069ce16af6e97c6.png)
![](https://img-blog.csdnimg.cn/direct/df2074877b6d471abb4bb9e2d1a8c5c7.png)
![](https://img-blog.csdnimg.cn/direct/f2828e63104c4e239b3070ca1b15c891.png)
![](https://img-blog.csdnimg.cn/direct/566de705741448ebad6352bca20df166.png)
![](https://img-blog.csdnimg.cn/direct/e1e9b7499fb744268d80709bb49e57ce.png)
(4)RabbitMQ如果有100万消息堆积在MQ,如何解决(消息堆积怎么解决)
![](https://img-blog.csdnimg.cn/direct/be5908f76d6a4b1db1e882cae5365160.png)
![](https://img-blog.csdnimg.cn/direct/38b713063c864b07a5d283cdac31b359.png)
![](https://img-blog.csdnimg.cn/direct/7af7c237aa314e7f9cafa6b8e866c71b.png)
![](https://img-blog.csdnimg.cn/direct/073cbf2086ea44279a712af0ed1c6f36.png)
(5)RabbitMQ的高可用机制有了解过吗?
![](https://img-blog.csdnimg.cn/direct/3b48e7eeb1884b89865bf98fcc59ef3f.png)
![](https://img-blog.csdnimg.cn/direct/97fdfb664b424c7aa115663972269145.png)
![](https://img-blog.csdnimg.cn/direct/80bb469e633240c7b32bcbf860f626cd.png)
![](https://img-blog.csdnimg.cn/direct/05e4d4c83565480ca11700371a5800d2.png)
![](https://img-blog.csdnimg.cn/direct/e358b8f60df84981b466e2b33a938e83.png)
七、Kafka
(1)Kafka是如何保证消息不丢失?
![](https://img-blog.csdnimg.cn/direct/27672fa310eb452aa20fb77f44d3cc6e.png)
![](https://img-blog.csdnimg.cn/direct/dc04bdc89b1d423196b14dea17ccde6b.png)
![](https://img-blog.csdnimg.cn/direct/3d502e2407b24845aa0271f76a2200e8.png)
![](https://img-blog.csdnimg.cn/direct/1a294fcea5044374aebcdeba61ec72a3.png)
![](https://img-blog.csdnimg.cn/direct/a304c3f451a04e91b224dec488966c33.png)
![](https://img-blog.csdnimg.cn/direct/ea4723d004ae4d1ea7289f2560461c43.png)
![](https://img-blog.csdnimg.cn/direct/c0f5c43223c44a7eaec880f66fd7f462.png)
![](https://img-blog.csdnimg.cn/direct/179b6f1f98d440979ed47b937ef4fa0b.png)
(2)Kafka是如何保证消费的顺序性的?
![](https://img-blog.csdnimg.cn/direct/e71eb270ab464bf5a706c5a71c0ff600.png)
![](https://img-blog.csdnimg.cn/direct/d8b96cef8ad942ec80a4201d92d20202.png)
![](https://img-blog.csdnimg.cn/direct/98b85858d7474a74aaf1d2acddf2153c.png)
![](https://img-blog.csdnimg.cn/direct/eeb398fcc5504965b7aabed1b5c15fa0.png)
(3)Kafka的高可用机制有了解过吗?
![](https://img-blog.csdnimg.cn/direct/6872976d0e6c4a04bf62419b45b0fe05.png)
![](https://img-blog.csdnimg.cn/direct/b90774031ca54150bf049fe15cc70a25.png)
![](https://img-blog.csdnimg.cn/direct/e610074428d44cf5b2305ccd6cc69de8.png)
![](https://img-blog.csdnimg.cn/direct/d1a69b2b3b78487eb22ffa01c6c367af.png)
![](https://img-blog.csdnimg.cn/direct/fdab9bcf36fb4bd39873052adf1fbda5.png)
![](https://img-blog.csdnimg.cn/direct/8d327e313911495ca29f46091f090ba8.png)
(4)Kafka数据清理机制了解过吗?
![](https://img-blog.csdnimg.cn/direct/251ec86452494b7ca81ff7206174be36.png)
![](https://img-blog.csdnimg.cn/direct/20ce5e9a925b415eb9acc59e19a0afcf.png)
![](https://img-blog.csdnimg.cn/direct/2640b877d67d4fbd9145878078188d50.png)
![](https://img-blog.csdnimg.cn/direct/8640181fbecf4d94a2e54d440b2fe3d4.png)
(5)Kafka中实现高性能的设计有了解过吗?
![](https://img-blog.csdnimg.cn/direct/15725df6337e44a8886bd6ec8a8ae312.png)
![](https://img-blog.csdnimg.cn/direct/f8106e02ba3d4d82b6984b92fe8ea341.png)
![](https://img-blog.csdnimg.cn/direct/262c46ded51e4fe487660fcbcf5005f8.png)
八、Java集合
![](https://img-blog.csdnimg.cn/direct/abcb2176338d4f6d9d5dee6feab9d2ec.png)
1. 数据结构
![](https://img-blog.csdnimg.cn/direct/e1df383b20e846fc9cd71328a3a22ea8.png)
![](https://img-blog.csdnimg.cn/direct/838455ae9b38419caeac1ad2b12730da.png)
![](https://img-blog.csdnimg.cn/direct/0a9be4f9e671418788d7c0a8110185d1.png)
(1)数组
![](https://img-blog.csdnimg.cn/direct/a4c3ce35912d461daeb838e8338f4ef1.png)
![](https://img-blog.csdnimg.cn/direct/c1a059bd1f1845c399e56b65f2e48184.png)
![](https://img-blog.csdnimg.cn/direct/0c477a21152b4e13a4ac653e40488829.png)
![](https://img-blog.csdnimg.cn/direct/f1b9b5abcd824a37831c87874cf599ff.png)
![](https://img-blog.csdnimg.cn/direct/e2fcd986b6184136be14a465149dc2d2.png)
![](https://img-blog.csdnimg.cn/direct/75c0ad91265e4a10ab9c58b31299c43d.png)
(2)ArrayList源码分析
![](https://img-blog.csdnimg.cn/direct/a4101a49629e4218beed0fc906123a9f.png)
![](https://img-blog.csdnimg.cn/direct/168a78c189a8471393c1ec77d6297b7d.png)
![](https://img-blog.csdnimg.cn/direct/9e598af3db7044cf9e08bf3838018cf2.png)
![](https://img-blog.csdnimg.cn/direct/3708e5bab89e4bbbbdb33560d3d5bf78.png)
(3)ArrayList底层的实习原理是什么?
![](https://img-blog.csdnimg.cn/direct/5208cdd1d85642c88f6e449c75312175.png)
(4)ArrayList list = new ArrayList(10)中的list扩容几次
![](https://img-blog.csdnimg.cn/direct/3ed1b30698e2401291f18c64c9d57024.png)
(5)如何实现数组和List之间的转换
![](https://img-blog.csdnimg.cn/direct/9cc2d138cbd04903aa07d2a10b85ec02.png)
![](https://img-blog.csdnimg.cn/direct/80bd497ffbb24d89965547119faa5e0b.png)
(6)单向链表
![](https://img-blog.csdnimg.cn/direct/4368187f15324be9bb761868fe6b7f36.png)
![](https://img-blog.csdnimg.cn/direct/22b60d901a45463690bcf695cf444047.png)
(7)双向链表
![](https://img-blog.csdnimg.cn/direct/65ed7dd3a49948f88dee9a8c1c89bfb6.png)
![](https://img-blog.csdnimg.cn/direct/722d04553c6e43eea6ff726862fb5883.png)
![](https://img-blog.csdnimg.cn/direct/f938bada95e645fd8e50cb9903a43b09.png)
(8)ArrayList和LinkedList的区别是什么?
![](https://img-blog.csdnimg.cn/direct/2fb03c635efa4b48a729170a921b819f.png)
![](https://img-blog.csdnimg.cn/direct/5834178c2bcb42f683bfe7c70b3ecb3c.png)
(9)二叉树
![](https://img-blog.csdnimg.cn/direct/fa0f35e75a304ed19d2d1b81a76a4846.png)
![](https://img-blog.csdnimg.cn/direct/c62108a496514895adb6128ac8cb646d.png)
![](https://img-blog.csdnimg.cn/direct/8c0b4c3b02854650856ba7cd3b6e2475.png)
![](https://img-blog.csdnimg.cn/direct/1b50c4cbe2f14f81afd99a75558002d5.png)
![](https://img-blog.csdnimg.cn/direct/901dfd508442416dbf9cb10a269ac47f.png)
![](https://img-blog.csdnimg.cn/direct/79a24deddec240aa9d0b5de29fbb302c.png)
![](https://img-blog.csdnimg.cn/direct/a042020a3b3e49c9a7fab32e4df583f9.png)
![](https://img-blog.csdnimg.cn/direct/eee88cb4b92f4cec84fb74eb69d5be26.png)
![](https://img-blog.csdnimg.cn/direct/50756c05f32c40ac986c956b45bd38a3.png)
![](https://img-blog.csdnimg.cn/direct/66c792ece45144f0ab57ead0a9b40702.png)
![](https://img-blog.csdnimg.cn/direct/adc8d3bf173a4a28991c2117bcb08c6d.png)
(10)散列表
![](https://img-blog.csdnimg.cn/direct/fe2fc62051e24bf8beda1fb15334e389.png)
![](https://img-blog.csdnimg.cn/direct/b84bf08b53af4f33b53694469b6f8a54.png)
![](https://img-blog.csdnimg.cn/direct/67511539c93f4f3abeca72fb793af5e4.png)
![](https://img-blog.csdnimg.cn/direct/801aebe159c94c1da9399316da59f5d9.png)
![](https://img-blog.csdnimg.cn/direct/d9c9df81008046a2a89e6de44e3f6b68.png)
![](https://img-blog.csdnimg.cn/direct/9aae74e93f624b67a2db306703e7c5d6.png)
![](https://img-blog.csdnimg.cn/direct/ea31e37d0e7544309d4eb070fb1eb295.png)
![](https://img-blog.csdnimg.cn/direct/7ebb1d6f959b48b39c6f65c06e4743bb.png)
(11)HashMap的实现原理
![](https://img-blog.csdnimg.cn/direct/b363cd44423e4ba8946e7c8ba489b379.png)
![](https://img-blog.csdnimg.cn/direct/04fbb5bf61494f02a6336c4837d63046.png)
(12)HashMap的put方法的具体流程
![](https://img-blog.csdnimg.cn/direct/8daaf64b465e499c9d48b5d27b3ab082.png)
![](https://img-blog.csdnimg.cn/direct/6a14b3d3a4ba4214911a174ab58da432.png)
![](https://img-blog.csdnimg.cn/direct/68373a7ee03b42e4aa3f5fb144c5d349.png)
![](https://img-blog.csdnimg.cn/direct/f19b7ea491b846558018e34f88a3c169.png)
(13)讲一讲HashMap的扩容机制
![](https://img-blog.csdnimg.cn/direct/99ebb004969e42d6a15b1bc9fab3fd1a.png)
![](https://img-blog.csdnimg.cn/direct/f116f3c11b2043f38d9b2c4e654b6d98.png)
(14)HashMap的寻址算法
![](https://img-blog.csdnimg.cn/direct/19146cf6d37343918d62739a69fc4eb8.png)
![](https://img-blog.csdnimg.cn/direct/2d91f5719f0a4670bc000717af8702c5.png)
![](https://img-blog.csdnimg.cn/direct/d76dbe744ff34fd1878ea38bcf102a28.png)
(15)HashMap在1.7情况下的多线程死循环问题
![](https://img-blog.csdnimg.cn/direct/61ebfa3d1ab849a4ab5948a427513a79.png)
![](https://img-blog.csdnimg.cn/direct/7e849774ce774884b444da5985a31103.png)
九、多线程
![](https://img-blog.csdnimg.cn/direct/b9b47ec1894c4d39a7bd606b364f9cab.png)
(1)线程和进程的区别?
![](https://img-blog.csdnimg.cn/direct/c63043d13e854d1391f5c0aa12269b86.png)
![](https://img-blog.csdnimg.cn/direct/27273f941b45400095fb9551a0dc4f06.png)
(2)并行和并发有什么区别?
![](https://img-blog.csdnimg.cn/direct/a3ad067910dc478bba19e85670440bc7.png)
![](https://img-blog.csdnimg.cn/direct/d0d75821651f47378d9b7b04c501aa95.png)
![](https://img-blog.csdnimg.cn/direct/836a76c975184246b90f4731780a897b.png)
![](https://img-blog.csdnimg.cn/direct/4d37503cf7554dd58a820f7c5c825f74.png)
(3)创建线程的方式有哪些?
![](https://img-blog.csdnimg.cn/direct/d3c5e5e5aa9447e882c4e6fbf7eb65fc.png)
![](https://img-blog.csdnimg.cn/direct/09a839f7a64b40ab9cf57f13b531a679.png)
![](https://img-blog.csdnimg.cn/direct/18eb0077f61b4654b24ac49987f45073.png)
![](https://img-blog.csdnimg.cn/direct/4e95a1c432d441a4bb50f6c0883e49b2.png)
![](https://img-blog.csdnimg.cn/direct/d07e7132a0074e488fd143dbb8f6936b.png)
![](https://img-blog.csdnimg.cn/direct/76b6b92e3ea94819ae8952c846a76f9d.png)
![](https://img-blog.csdnimg.cn/direct/91532c1179864258b0f8319b0f1f8875.png)
(4)线程包括哪些状态,状态之间是如何变化的
![](https://img-blog.csdnimg.cn/direct/6b1f1d00253b481796867f4b7438430b.png)
![](https://img-blog.csdnimg.cn/direct/2440954ac4954c4cb51e5cd80e47147d.png)
![](https://img-blog.csdnimg.cn/direct/67f245eaab6247909231bcd520344539.png)
(5)新建T1、T2、T3三个线程,如何保证它们按顺序进行?
![](https://img-blog.csdnimg.cn/direct/cc86fa9276de4b3dabf9af7f6f103252.png)
(6)notify()和notifyAll()有什么区别?
![](https://img-blog.csdnimg.cn/direct/ea7b91dc10014e89b4c07dd1dcda2921.png)
(7)在Java中wait和sleep方法的不同?
![](https://img-blog.csdnimg.cn/direct/556ab6c2195f421bba9145480d4aaa9e.png)
(8)如何停止一个正在运行的线程?
![](https://img-blog.csdnimg.cn/direct/a8c430c133db4a6caa201bf729bb8389.png)
(9)synchronized关键字的底层原理
![](https://img-blog.csdnimg.cn/direct/13a1221a7edf4e358e3d03854d602b92.png)
![](https://img-blog.csdnimg.cn/direct/eb5cb76832244c659c002f7e672251f9.png)
![](https://img-blog.csdnimg.cn/direct/2ded862ae8524e3d984c4af73d94c53b.png)
![](https://img-blog.csdnimg.cn/direct/228ee52281af48dc95f11497ed8eb842.png)
![](https://img-blog.csdnimg.cn/direct/d8cd4a2490b24083b2809852e74d62bc.png)
![](https://img-blog.csdnimg.cn/direct/1081ea540a6b4495a33272d1e135a9c6.png)
![](https://img-blog.csdnimg.cn/direct/b2316b6694a2472f8b1ecba81328b533.png)
![](https://img-blog.csdnimg.cn/direct/462d3f0c21b0411889d0af477df15f4d.png)
![](https://img-blog.csdnimg.cn/direct/8dfc33ce6cfb4f8e84b901a002ab141b.png)
![](https://img-blog.csdnimg.cn/direct/f9788534694f4b8c8aed792006afaf99.png)
![](https://img-blog.csdnimg.cn/direct/dfcb9c31d1eb4f1c962c3540e7fff692.png)
![](https://img-blog.csdnimg.cn/direct/bb9bbcb0c6054fb99973582725e656d4.png)
![](https://img-blog.csdnimg.cn/direct/11a581adb1d9429dabf56762669e097c.png)
![](https://img-blog.csdnimg.cn/direct/4f7948d988074447999cc4cc19522d42.png)
(10)你谈谈JMM(Java内存模型)
JMM(Java Memory Model)Java内存模型,定义了共享内存中多线程程序读写操作的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确性。
![](https://img-blog.csdnimg.cn/direct/08e82f16954d4dcd9030665408801b7d.png)
![](https://img-blog.csdnimg.cn/direct/b94146c482aa4ceea6dbca64b53c32a1.png)
(11)CAS你知道吗?
![](https://img-blog.csdnimg.cn/direct/d948e25c70514d36a97a9e9cd5eb511e.png)
![](https://img-blog.csdnimg.cn/direct/eba387c37271497cbfbea9bf4ae78e46.png)
(12)谈谈你对volatitle的理解
![](https://img-blog.csdnimg.cn/direct/a783eb6b25e947e59b1fa8be28cefd99.png)
![](https://img-blog.csdnimg.cn/direct/40a8bbd97176499d8a7ead1e5b55db50.png)
![](https://img-blog.csdnimg.cn/direct/b1341046f49a428bbea31f4f4e494aeb.png)
![](https://img-blog.csdnimg.cn/direct/4b123b04c42f43749a0506c24a0c2737.png)
![](https://img-blog.csdnimg.cn/direct/4a6398e10736476d989c7d4c63834440.png)
![](https://img-blog.csdnimg.cn/direct/8d090bff7b6a4e199d0522b25aa2ce7e.png)
(13)什么是AQS?
全称是AbstractQueuedSynchronizer,即抽象队列同步器。它是构建锁或者其他同步组件的基础框架。
![](https://img-blog.csdnimg.cn/direct/65139f70ba1542c1bcc77d0377f90c09.png)
![](https://img-blog.csdnimg.cn/direct/1766c3765ba34216a95a48999a9bfdb0.png)
![](https://img-blog.csdnimg.cn/direct/6c3fbcc2a20940ee926a5b2abaac88d9.png)
![](https://img-blog.csdnimg.cn/direct/e1c53239178c4fbaaa7a39af933a1938.png)
![](https://img-blog.csdnimg.cn/direct/e2b19798ea814ecdb9c8112b900a9c29.png)
(14)ReentrantLock的实现原理
![](https://img-blog.csdnimg.cn/direct/0bb824b47e094078a69f091cb0bdc9b8.png)
![](https://img-blog.csdnimg.cn/direct/c55d6898c32846fab58eac9564cb2116.png)
![](https://img-blog.csdnimg.cn/direct/8a680c71406646689c69d32d7fa7195b.png)
(15)synchronized和Lock有什么区别?
![](https://img-blog.csdnimg.cn/direct/917f60f592db49fba14ac7c92be394be.png)
(16)死锁产生的条件是什么?
![](https://img-blog.csdnimg.cn/direct/09bc3c08fda0430bbd71cddbdc7fa10f.png)
![](https://img-blog.csdnimg.cn/direct/09428e84e9ee4cf7843bfcdc501b61fb.png)
![](https://img-blog.csdnimg.cn/direct/541a4a1075fb45cba8f43bbdcac5fde7.png)
![](https://img-blog.csdnimg.cn/direct/f7b34014a27343d29f5ee668786aed7f.png)
![](https://img-blog.csdnimg.cn/direct/3bdf7b703de041efa17c5d2641b6dcf1.png)
![](https://img-blog.csdnimg.cn/direct/6fb3e6ad67054c53ab5556412f21bde4.png)
(17)谈谈你对ConcurrentHashMap的理解
![](https://img-blog.csdnimg.cn/direct/f3416afcbbb44e038bb44d3db2d21f00.png)
![](https://img-blog.csdnimg.cn/direct/03c2e3c8c29d407a946b70e33f5b8e47.png)
![](https://img-blog.csdnimg.cn/direct/bb730692227a4c9582b2136bb9af24de.png)
![](https://img-blog.csdnimg.cn/direct/d5c982f6e33c4484b9c877daa7152298.png)
![](https://img-blog.csdnimg.cn/direct/b1c5d2f0bec04f0ea11f18722ac3021a.png)
(18)导致并发程序出现问题的根本原因是什么?(Java程序中怎么保证多线程的执行安全)
Java并发编程的三大特性:原子性、可见性、有序性
![](https://img-blog.csdnimg.cn/direct/79bd2c0d39dd4640bacc2e55a9e751a6.png)
![](https://img-blog.csdnimg.cn/direct/72e4a14e145b4ef29d9dccf75d1a7c4c.png)
![](https://img-blog.csdnimg.cn/direct/3e6fe183a57942418f3fc8b398c646d0.png)
![](https://img-blog.csdnimg.cn/direct/51f0b7560f354287883ec6cc3cd96ec1.png)
(19)说一下线程池的核心参数(线程池的执行原理知道吗)
![](https://img-blog.csdnimg.cn/direct/256e7bcec6184b51b161b7fa6f1dc02d.png)
![](https://img-blog.csdnimg.cn/direct/f43093627ddf4b9cbb2e789899d87889.png)
(20)线程池中有哪些常见的阻塞队列
![](https://img-blog.csdnimg.cn/direct/14da83ddb4b54319919967fe26bb28c3.png)
![](https://img-blog.csdnimg.cn/direct/c46508568549441c8cf8070af91a8bbc.png)
(21)如何确定核心线程数
![](https://img-blog.csdnimg.cn/direct/c6614537c7ca4aaa95bd11af48e37095.png)
![](https://img-blog.csdnimg.cn/direct/56a91b9fc1504337aca23be2e156dea1.png)
(22)线程池的种类有哪些?
![](https://img-blog.csdnimg.cn/direct/06588aade3d648669b59aaf135592133.png)
![](https://img-blog.csdnimg.cn/direct/748a9319c77d4b9e9ed28d8b39d0831e.png)
![](https://img-blog.csdnimg.cn/direct/b34f56e98645457595363c7c4f502775.png)
![](https://img-blog.csdnimg.cn/direct/0892de75653840f39911875f4d7c0466.png)
(23)为什么不建议用Executors创建线程池
![](https://img-blog.csdnimg.cn/direct/1c7f019861bd49a58656294231826387.png)
(24)线程池使用场景(CountDownLatch、Future)
CountDownLatch
![](https://img-blog.csdnimg.cn/direct/b79d5b86f3464afcab9484f776bb03e6.png)
![](https://img-blog.csdnimg.cn/direct/32efb2f83c004de986424d9254753a56.png)
![](https://img-blog.csdnimg.cn/direct/920e7114dd6b4ba4b880b87677ae13f3.png)
![](https://img-blog.csdnimg.cn/direct/f64948ccb07e44e3bfde90af81adc559.png)
![](https://img-blog.csdnimg.cn/direct/32d7d340e100490c8039b59d7e9cb487.png)
![](https://img-blog.csdnimg.cn/direct/c4bc261d14f94c438771d44841520524.png)
![](https://img-blog.csdnimg.cn/direct/0c8f84f2dca443d9812d2c9dc9780f80.png)
(25)如何控制某个方法允许并发访问线程的数量
![](https://img-blog.csdnimg.cn/direct/8d8da9d8098749c794370589297c7867.png)
![](https://img-blog.csdnimg.cn/direct/ec86288d7413440499009979a4cfec4c.png)
(26)谈谈你对ThreadLocal的理解
![](https://img-blog.csdnimg.cn/direct/68f93290c5dc4cf494c8a830e09c23aa.png)
![](https://img-blog.csdnimg.cn/direct/c53fb5a9e058426b9c1820ae1b322458.png)
![](https://img-blog.csdnimg.cn/direct/b71e8201c6e74ec9be9216932aab51fa.png)
![](https://img-blog.csdnimg.cn/direct/602eb1f5b3b74e1597ddb4f72fa56018.png)
![](https://img-blog.csdnimg.cn/direct/df705bb106f14a4f827790c4fba6fa40.png)
![](https://img-blog.csdnimg.cn/direct/e1d965be81804c0c8fa31ce7932bc878.png)
![](https://img-blog.csdnimg.cn/direct/53146f6d7a6648ca8f63db3409bfe1ac.png)
十、JVM
(1)JVM是什么
Java Virtual Machine:Java程序的运行环境(java二进制字节码的运行环境)
![](https://img-blog.csdnimg.cn/direct/77ba33b1618e4325875b34b713923ae8.png)
(2)JVM由哪些部分组成,运行流程是什么?
![](https://img-blog.csdnimg.cn/direct/0356b27955684bb181ed23153c97643d.png)
(3)什么是程序计数器?
程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。
(4)能详细介绍一下Java堆吗?
线程共享的区域:主要用来保存对象实例、数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。
![](https://img-blog.csdnimg.cn/direct/35ac2061b36d4b768b155e6646e35899.png)
![](https://img-blog.csdnimg.cn/direct/b83be85c5afc4232b09b54485020c6f8.png)
(5)什么是虚拟机栈
Java Virtual machine Stacks(java 虚拟机栈)
每个线程运行时所需要的内存,称为虚拟机栈,先进后出
每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
![](https://img-blog.csdnimg.cn/direct/9ec00409449e4bf594e94263e5e0f1ae.png)
![](https://img-blog.csdnimg.cn/direct/ef223737e28e41d48367811978b3717d.png)
![](https://img-blog.csdnimg.cn/direct/598c0d6fbc134424be7768297432b7d8.png)
![](https://img-blog.csdnimg.cn/direct/fd90b326f1cd428d82e54e9ece05439b.png)
![](https://img-blog.csdnimg.cn/direct/8371ac561b244d2ba4335ef151e7fb3d.png)
(6)能不能解释一下方法区?
![](https://img-blog.csdnimg.cn/direct/d623aefb22994636951e3670a85d4a79.png)
![](https://img-blog.csdnimg.cn/direct/dab73aa8f6da4bf9883b2f0e1226be6f.png)
![](https://img-blog.csdnimg.cn/direct/ce9dff4e07c042bb8129b559d267ea8f.png)
(7)你听过直接内存吗?
直接内存:并不属于JVM中的内存结构,不由JVM进行管理。是虚拟机的系统内存,常见于NIO操作时,用于数据缓存区,它分配回收成本较高,但读写性能高,不受JVM内存回收管理。
![](https://img-blog.csdnimg.cn/direct/f01e2f6ee41940efae927519428de30d.png)
![](https://img-blog.csdnimg.cn/direct/16ce94b7045a4eaf9990705558b43532.png)
(8)什么是类加载器,类加载器有哪些?
![](https://img-blog.csdnimg.cn/direct/6413487b1e1347729dc67b3e6009ddb1.png)
![](https://img-blog.csdnimg.cn/direct/20db88d4bdde474bb4c245c2ccace4be.png)
![](https://img-blog.csdnimg.cn/direct/0c9e6940043c4c81822d8ae782028027.png)
(7)什么是双亲委派模型?
![](https://img-blog.csdnimg.cn/direct/c5594aaedc46409f98f71a109c89682d.png)
![](https://img-blog.csdnimg.cn/direct/8c866ad229b74cd69c316f42f4173f43.png)
(8)说一下类装载的执行过程
类从加载到虚拟机中开始,知道卸载为止,它的整个生命周期包括了:加载、验证、解析、初始化、使用和卸载着7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)
![](https://img-blog.csdnimg.cn/direct/2e8680f4660c47908231f5a565674be3.png)
![](https://img-blog.csdnimg.cn/direct/10fdc2c1975e483c952e0bd8ae5620a0.png)
![](https://img-blog.csdnimg.cn/direct/542f49cf28254ec7bd2e4c22c7287519.png)
![](https://img-blog.csdnimg.cn/direct/0eb6ca690b4d4d27b8ebf4566840a47c.png)
![](https://img-blog.csdnimg.cn/direct/a83a67f2e43a4aee8d8a178bad6de319.png)
![](https://img-blog.csdnimg.cn/direct/0ed5e200bc3a4fe58b56fdbed08d44dc.png)
![](https://img-blog.csdnimg.cn/direct/3e49b91c921745599131726eac016dc8.png)
![](https://img-blog.csdnimg.cn/direct/0d87146f459f438eb34068ce0cf58fb9.png)
(9)对象什么时候可以被垃圾器回收
如果一个对象或多个对象没有任何的引用指向它了,那么这个对象限现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。
如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法
![](https://img-blog.csdnimg.cn/direct/d1f7bb4e70fa462c83f4e2b365c2bcb5.png)
![](https://img-blog.csdnimg.cn/direct/c7f9baea609846c592eed5ac01f474e8.png)
![](https://img-blog.csdnimg.cn/direct/4312f3ca6dec479a943387cd88e0eefd.png)
![](https://img-blog.csdnimg.cn/direct/d0063aeb0c174f69846868fbc09a696a.png)
![](https://img-blog.csdnimg.cn/direct/ef30e8f212c24abe82071b863c934529.png)
(10)JVM垃圾回收算法有哪些?
①标记清除算法;②复制算法;③标记整理算法
![](https://img-blog.csdnimg.cn/direct/0a70f78562b543cc8de183e6d6176cb9.png)
![](https://img-blog.csdnimg.cn/direct/0f4ad5935d484972b5b63ce98500fb61.png)
![](https://img-blog.csdnimg.cn/direct/229f74f062ed42d6a328e7886a86459f.png)
![](https://img-blog.csdnimg.cn/direct/ae089a8a49844f7997f5c15ef603632a.png)
(11)说一下JVM中的分代回收
![](https://img-blog.csdnimg.cn/direct/7dac0d3938f6406ba9849253ec8213b8.png)
![](https://img-blog.csdnimg.cn/direct/02cade8d7dab462eb9a9131e99ed376c.png)
![](https://img-blog.csdnimg.cn/direct/d9de4550a01348609d86308d6aba3032.png)
![](https://img-blog.csdnimg.cn/direct/039a8025f8074d8ca6bd134dd5d67120.png)
(12)说一下JVM有哪些垃圾回收器?
在JVM中,实现了多种垃圾收集器,包括:①串行垃圾收集器、并行垃圾收集器、CMS(并发)垃圾收集器;④G1垃圾收集器
![](https://img-blog.csdnimg.cn/direct/f1d12f648ecf4e56be83b77860fb939e.png)
![](https://img-blog.csdnimg.cn/direct/288018586079421981f423f442eb68a2.png)
![](https://img-blog.csdnimg.cn/direct/329a23ac13fb409f8c0cd7c91490162e.png)
![](https://img-blog.csdnimg.cn/direct/387af395e9804c17a86e8d42078b0b3d.png)
![](https://img-blog.csdnimg.cn/direct/9c751aa7889d4a3f89fb649acff14a5c.png)
![](https://img-blog.csdnimg.cn/direct/2248f84945344ff480f4e4d633d282f3.png)
![](https://img-blog.csdnimg.cn/direct/1d1356a0b27149e180f011337957687f.png)
复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集
![](https://img-blog.csdnimg.cn/direct/b43acc46225149ec82c54d41a78137c4.png)
![](https://img-blog.csdnimg.cn/direct/b3a5763573604035acffbbe96ff0d041.png)
(13)强引用、软引用、弱引用、虚引用的区别
强引用:只有所有GC Roots对象不通过【强引用】引用该对象,该对象才能被垃圾回收
![](https://img-blog.csdnimg.cn/direct/65658f58f8c1416faef844b99b110596.png)
软引用:仅有软引用该对象时,在垃圾回收后,内存仍不足时会再次触发垃圾回收
![](https://img-blog.csdnimg.cn/direct/187d3f4a99794e988c3d16806d307e30.png)
弱引用:仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
![](https://img-blog.csdnimg.cn/direct/06f3474bb190487d8e3ee5ae6989009e.png)
虚引用 :必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存。
![](https://img-blog.csdnimg.cn/direct/5b2eb18bd4a146bd9777b0d819b9026a.png)
![](https://img-blog.csdnimg.cn/direct/2851bba1972c489a83e50c1e4d159956.png)
(14)JVM调优的参数可以在哪里设置参数值
war包部署在tomcat中设置
修改TOMCAT_HOME/bin/catalina.sh文件
![](https://img-blog.csdnimg.cn/direct/22e8a7797cc7439fb7b9559db055eb0a.png)
jar包部署在启动参数设置
通常在linux系统下直接加参数启动springboot项目
![](https://img-blog.csdnimg.cn/direct/9b7bcb3097864780b04f8542c941c0e2.png)
nohup:用于在系统后台不断地运行命令,退出终端不会影响程序的运行
参数 &:让命令在后台执行,终端退出后命令仍旧执行
(15)JVM调优的参数都有哪些?
d对于JVM调优,主要是调整年轻代、老年代、元空间的的内存空间大小及使用的垃圾回收器类型。
设置堆空间大小
![](https://img-blog.csdnimg.cn/direct/8a8e87cdd3c948b49fdb82e24d7da25a.png)
虚拟机栈的设置
![](https://img-blog.csdnimg.cn/direct/bf74a385c64f4571849a70f9bc2f51b8.png)
年轻代中Eden区和两个Survivor区的大小比例
年轻代晋升老年代阈值
![](https://img-blog.csdnimg.cn/direct/5ebc11108b8b4587b642a14afc8faa57.png)
设置垃圾回收收集器
![](https://img-blog.csdnimg.cn/direct/759c01b69b5f42239ac0691ad9c33a6e.png)
(16)说一下JVM调优的工具?
![](https://img-blog.csdnimg.cn/direct/4c28d11cb0ca4c0fb2b5f68832dc3ef7.png)
![](https://img-blog.csdnimg.cn/direct/1d90506c76214ef4a0292e2367bff6f0.png)
![](https://img-blog.csdnimg.cn/direct/50ab3ce423ba4e348caaedafc0f16cf3.png)
![](https://img-blog.csdnimg.cn/direct/3b3910e417b4410e8e9dedabe7fb36fa.png)
![](https://img-blog.csdnimg.cn/direct/f958ebd2d9c6403680499e868cf4b64b.png)
![](https://img-blog.csdnimg.cn/direct/a567bde7683e4decae44768328afce25.png)
(17)Java内存泄露的排查思路?
![](https://img-blog.csdnimg.cn/direct/a214a78c0c8e4408af3e5788dfb1a1c8.png)
![](https://img-blog.csdnimg.cn/direct/229788f538ce4c15842035970d0095ca.png)
- 通过jmap指令打印它的内存快照dump(Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中)
![](https://img-blog.csdnimg.cn/direct/67f8e38e639a4a3f84596c28f3cdaf46.png)
- 通过工具,VisualVM去分析dump文件,VisualVM可以加载离离线的dump文件
![](https://img-blog.csdnimg.cn/direct/b6627621d7e34d19a83c06f379b8d136.png)
- 通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
![](https://img-blog.csdnimg.cn/direct/bbab63d159cd4390873cb5b16eae4fe3.png)
(18)CPU飙高排查方案与思路?
![](https://img-blog.csdnimg.cn/direct/a4b68f8eac4e4f8b976769423c9f299c.png)
![](https://img-blog.csdnimg.cn/direct/37a9d2e400e74577a5688f39ecfaf201.png)
![](https://img-blog.csdnimg.cn/direct/b1acbe94b68746958eb193d1c56ad55a.png)
![](https://img-blog.csdnimg.cn/direct/cd4e1c6d683d4387bbe77482a689c6a1.png)
![](https://img-blog.csdnimg.cn/direct/3dc49ddb497249eaafb24dcd1863f37d.png)
十一、设计模式
(1)简单工厂模式
![](https://img-blog.csdnimg.cn/direct/fbb5faa78c2e4938a32a2efe5f85d795.png)
(2)工厂方法模式
![](https://img-blog.csdnimg.cn/direct/4ce36a34e1724d7e87646e20484ee416.png)
![](https://img-blog.csdnimg.cn/direct/a0eec7aab03242f0bab4df171c526fdb.png)
(3)抽象工厂模式
![](https://img-blog.csdnimg.cn/direct/a2d6d121fd444f46b2995e331fc9cdf9.png)
![](https://img-blog.csdnimg.cn/direct/fa334606470e4a6581a816dccb0e1fc0.png)
![](https://img-blog.csdnimg.cn/direct/8ddded5dfb82412ca6c0349605b88dc5.png)
![](https://img-blog.csdnimg.cn/direct/596315f10d5b45eaaffd1d212b94d555.png)
(4)策略模式
![](https://img-blog.csdnimg.cn/direct/1a20434e15b042c7bc3d686be3bad13a.png)
![](https://img-blog.csdnimg.cn/direct/a6eb9e8d68f64674b8c0529757ff9149.png)
![](https://img-blog.csdnimg.cn/direct/c6f1b5fd716242c1998a022cfdda20be.png)
![](https://img-blog.csdnimg.cn/direct/e2f0814d5a9f486ababdf17d904b85d5.png)
(5)责任链设计模式
![](https://img-blog.csdnimg.cn/direct/2dec754ef8334b719ac7fbac2a5fda29.png)
![](https://img-blog.csdnimg.cn/direct/b8c241643b5b460a9551b03cf9ef0366.png)
![](https://img-blog.csdnimg.cn/direct/89a307f1a54b484ea9b1ad4aedde7674.png)
![](https://img-blog.csdnimg.cn/direct/40a3e8c93f9e45a3a84f5ab77707f3e7.png)
十二、其他
(1)单点登录这块怎么实现?
单点登录的英文名叫作:Single Sign On(简称SSO),只需要登录一次,就可以访问所有信任的应用系统。
![](https://img-blog.csdnimg.cn/direct/6ed8f51f7e804cf3a49a06b0330f298c.png)
![](https://img-blog.csdnimg.cn/direct/3aa0972b00434684b979d9e23ab9689b.png)
![](https://img-blog.csdnimg.cn/direct/8dc726ee675d45419ca8abbb361b00ca.png)
(2)权限认证是如何实现的?
后台的管理系统,更注重权限控制,最常见的就是RBAC模型来指导实现权限
RBAC(Role-Based Access Control)基于角色的访问控制
![](https://img-blog.csdnimg.cn/direct/c6222125bccb4b1280344e63fc8fcdf6.png)
![](https://img-blog.csdnimg.cn/direct/8c071871289b41d7be877d9df10beed1.png)
![](https://img-blog.csdnimg.cn/direct/f8239bcd9f7f41da99494a34ee9761a1.png)
(3)上传数据的安全性你们是怎么控制的?
![](https://img-blog.csdnimg.cn/direct/41ce600f2482466eadf379e6e13d81a8.png)
![](https://img-blog.csdnimg.cn/direct/1216eb4532e1496fb13f833e8c76bd2b.png)
![](https://img-blog.csdnimg.cn/direct/dc12b8a2eb1a4de7b949d98490d85a37.png)
(4)你负责项目的时候遇到了哪些比较棘手的问题?怎么解决的?
![](https://img-blog.csdnimg.cn/direct/96fffbb840d243039357fcc20975f8ee.png)
(5)你们项目中日志怎么采集的?
![](https://img-blog.csdnimg.cn/direct/f6900d99fc1645e5974c6f20091b8e72.png)
![](https://img-blog.csdnimg.cn/direct/55340fab923141289269af5ab844612b.png)
![](https://img-blog.csdnimg.cn/direct/415273c7a1b3421abc53e732ae90f992.png)
(6)查看日志的命令
![](https://img-blog.csdnimg.cn/direct/b8c63c4abca440e68182aa9bb660eceb.png)
![](https://img-blog.csdnimg.cn/direct/24f507c213754200a9c0ffdd5e3deaa0.png)
(7)生产问题怎么排查?
![](https://img-blog.csdnimg.cn/direct/abf68b8e97664114a557cff32ffe9f34.png)
![](https://img-blog.csdnimg.cn/direct/4b87369801d44b83b475fc467203b169.png)
![](https://img-blog.csdnimg.cn/direct/8520f72a68b44acf8ad6cb5b30472858.png)
![](https://img-blog.csdnimg.cn/direct/770ea8d5db7c499d865f5a13db8f90c8.png)
(8)怎么快速定位系统的瓶颈
![](https://img-blog.csdnimg.cn/direct/f0c99a9ac4c4471ea7dae66cabd80f1e.png)