2019年乐信⾯试题(Java)
乐信
1.画出项⽬的架构图
2.所处⾃⼰负责的业务模块,其中⽤到了哪些技术点?
3.如何实现最终⼀致性分布式事务?
1. ⼆阶段提交:
a. 概念:参与者将操作成败通知协调者,再由协调者根据所有参与者的
反馈情报决定各参与者是否要提交操作还是中⽌操作。
b. 作⽤:主要保证了分布式事务的原⼦性;第⼀阶段为准备阶段,第⼆
阶段为提交阶段;
c. 缺点:不仅要锁住参与者的所有资源,⽽且要锁住协调者资源,开销
⼤。⼀句话总结就是:2PC效率很低,对⾼并发很不友好。
2. 三阶段提交:
a. 概念:三阶段提交协议在协调者和参与者中都引⼊超时机制,并且把
两阶段提交协议的第⼀个阶段拆分成了两步:询问,然后再锁资源,最
后真正提交。这样三阶段提交就有CanCommit、PreCommit、
DoCommit三个阶段。
b. 缺点:如果进⼊PreCommit后,Coordinator发出的是abort请求,假
设只有⼀个Cohort收到并进⾏了abort操作,
⽽其他对于系统状态未知的Cohort会根据3PC选择继续Commit,此时系统状态
发⽣不⼀致性。
3. 柔性事务:
a. 概念:所谓柔性事务是相对强制锁表的刚性事务⽽⾔。流程⼊下:
服务器A的事务如果执⾏顺利,那么事务A就先⾏提交,如果事务B也执
⾏顺利,则事务B也提交,整个事务就算完成。但是如果事务B执⾏失
败,事务B本⾝回滚,这时事务A已经被提交,所以需要执⾏⼀个补偿操
作,将已经提交的事务A执⾏的操作作反操作,恢复到未执⾏前事务A的
状态。
b. 缺点:业务侵⼊性太强,还要补偿操作,缺乏普遍性,没法⼤规模推
⼴。
4. 消息最终⼀致性解决⽅案之RabbitMQ实现:
a. 实现:发送⽅确认+消息持久化+消费者确认。
4.索引的B+树结构是咋样的?
5. B-tree:
B-tree 利⽤了磁盘块的特性进⾏构建的树。每个磁盘块⼀个节点,每个
节点包含了很关键字。把树的节点关键字增多后树的层级⽐原来的⼆叉树少
了,减少数据查的次数和复杂度。
B-tree巧妙利⽤了磁盘预读原理,将⼀个节点的⼤⼩设为等于⼀个⻚
(每⻚为4K),这样每个节点只需要⼀次I/O就可以完全载⼊。
B-tree 的数据可以存在任何节点中。
6. B+tree:
B+tree 是 B-tree 的变种,B+tree 数据只存储在叶⼦节点中。这样在B
树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所
有指关键字指针都存在叶⼦节点,所以每次查的次数都相同所以查询速度更稳
定;
5.哪些情况下索引会失效?除了加索引优化查询,还有哪些⽅法?
6.说说⾃⼰了解的设计模式?Spring中⽤到了哪些设计模式?⾃⼰有⽤过哪些设
计模式吗?
7. spring中的设计模式:
a. 简单⼯⼚:spring中的BeanFactory就是简单⼯⼚模式的体现,根据传⼊⼀个
唯⼀的标识来获得bean对象,但是否是在传⼊参数后创建还是传⼊参数前创建这个
要根据具体情况来定。
b. 单例模式:Spring下默认的bean均为singleton。
c. 代理模式:为其他对象提供⼀种代理以控制对这个对象的访问。 从结构上来看
和Decorator模式类似,但Proxy是控制,更像是⼀种对功能的限制,⽽Decorator 是增加职责。 spring的Proxy模式在aop中有体现,⽐如JdkDynamicAopProxy和Cglib2AopProxy。
d. 观察者模式:定义对象间的⼀种⼀对多的依赖关系,当⼀个对象的状态发⽣改变
时,所有依赖于它的对象都得到通知并被⾃动更新。spring中Observer模式常⽤的地⽅是listener的实现。如ApplicationListener。
7.TCP的三次握⼿四次挥⼿机制?
8. TCP建⽴连接的过程。
三次握⼿:
9. 第⼀次握⼿(客户端发送syn包到服务器端):客户端发送syn包到服务
器端,进⼊syn_send状态,等待服务器端的确认;
10. 第⼆次握⼿(服务器返回syn+ack包给客户端):服务器端收到客户端
的syn包,发送syn+ack包给客户端,进⼊syn_recv状态;
11. 第三次握⼿(客服端返回ack包给服务端):客户端收到服务器端的
syn+ack包,发送个ack包到服务器端,⾄此,客户端与服务器端进⼊
established状态;
12. 握⼿过程中传送的包不包含任何数据,连接建⽴后才会开始传送数
据,理想状态下,TCP连接⼀旦建⽴,在通信双⽅的任何⼀⽅主动关闭
连接前,TCP连接都会⼀直保持下去。
13. TCP断开连接的过程。
四次挥⼿:
14. 第⼀次挥⼿:主动关闭⽅发送fin包到被动关闭⽅,告诉被动关闭⽅我
不会再给你发送数据了;
15. 第⼆次挥⼿:被动关闭⽅收到syn包,发送ack给对⽅,确认序号为收
到序号+1;
16. 第三次挥⼿:被动关闭⽅也也发送fin包给主动关闭⽅,告诉对⽅我也
不会给你发送数据了;
17. 第四次挥⼿:主动关闭⽅收到syn包,发送ack给对⽅,⾄此,完成四
次挥⼿;
8.Https原理?
HTTPS协议就是基于SSL的HTTP协议
HTTPS使⽤与HTTP不同的端⼝(HTTPM80 , HTTPSM443)
提供了⾝份验证与加密通信⽅法,被⼴泛⽤于互联⽹上安全敏感的通
信。
1、客户端请求SSL连接,并将⾃⼰⽀持的加密规则发给⽹站。
2、服务器端将⾃⼰的⾝份信息以证书形式发回给客户端。证书⾥
⾯包含了⽹站地址,加密公钥,以及证书的颁发机构。
3、获得证书后,客户要做以下⼯作
验证证书合法性
如果证书受信任,客户端会⽣成⼀串随机数的密码,并⽤证
书提供的公钥进⾏加密。
将加密好的随机数发给服务器。
4、获得到客户端发的加密了的随机数之后,服务器⽤⾃⼰的私钥
进⾏解密,得到这个随机数,把这个随机数作为对称加密的密钥。
(利⽤⾮对称加密传输对称加密的密钥)
5、之后服务器与客户之间就可以⽤随机数对各⾃的信息进⾏加
密,解密。
注意的是:证书是⼀个公钥,这个公钥是进⾏加密⽤的。⽽私钥是
进⾏解密⽤的。公钥任何都知道,私钥只有⾃⼰知道。这是⾮对称
加密。
⽽对称加密就是钥匙只有⼀把,我们都知道。
之所以⽤到对称加密,是因为对称加密的速度更快。⽽⾮对称加密
的可靠性更⾼。
客户端请求–服务端发送证书(公钥)–客户端验证证书,并⽣成
随机数,通过公钥加密后发送给服务端–服务端⽤私钥解密出随机
数–对称加密传输数据。
9.Redis的数据类型有哪些?与Memcached的区别?
Redis⽬前⽀持5种数据类型,分别是:
String(字符串)
java中常用的设计模式有哪些List(列表)
Hash(字典)
Set(集合)
Sorted Set(有序集合)
区别
1、memcache⽀持k/v类型数据;
2、redis除了缓存k/v类型数据之外,还能缓存list、set、hash等数据结构
的数据;
⽤中发现这些其实是会托累服务器的性能,⽽我们全部都不能⽤.我们得⾃已做;
memcached以上都不管,我们也得⾃已做;
4.如果需要在服务器端做⼀些聚合的运算,⽤redis;如果只是做缓存,redis虽
然可以,但性能很差.在要求⾼性能的环境下使⽤memcached更合适;
10.消息队列有⽤到吗?具体在项⽬中是怎么⽤的?如何保证消息的可靠传递?
详⻅“⾯试题库/RabbitMQ”
0304 乐信
微服务框架⽤的dubbo
18. 说说java集合,每个集合下⾯有哪些实现类,及其数据结构?
深⼊理解这篇:www.jianshu/p/63e76826e852
19. 介绍⼀下红⿊树、⼆叉平衡树。
理解这篇:juejin.im/post/5a27c6946fb9a0450*******
20. jdk1.8中ConcurrentHashMap size⼤于8时会转化成红⿊树,请问有什么
作⽤,如果通过remove操作,size⼩于8了,会发⽣什么?
21. 说说java同步机制,java有哪些锁,每个锁的特性?
看这篇:blog.csdn/vking_wang/article/details/9952063
22. 说说volatile如何保证可⻅性,从cpu层⾯分析。
需深⼊理解:juejin.im/post/5ae9b41b518825670b33e6c4
23. spring加载bean的顺序?
spring容器及bean加载机制源码解
读:blog.csdn/songyang19871115/article/details/54342242
24. 哪些对象会被存放到⽼年代?
25. 新⽣代对象每次经历⼀次minor gc,年龄会加1,当达到年龄阈值
(默认为15岁)会直接进⼊⽼年代;
26. ⼤对象直接进⼊⽼年代;
27. 新⽣代复制算法需要⼀个survivor区进⾏轮换备份,如果出现⼤量对
象在minor gc后仍然存活的情况时,就需要⽼年代进⾏分配担保,让
survivor⽆法容纳的对象直接进⼊⽼年代;
28. 如果在Survivor空间中相同年龄所有对象⼤⼩的总和⼤于Survivor空
间的⼀半,年龄⼤于或等于该年龄的对象就可以直接进⼊年⽼代。
29. 什么时候触发full gc?
(1)调⽤时,系统建议执⾏Full GC,但是不必然执⾏
(2)⽼年代空间不⾜
(3)⽅法去空间不⾜
(4)通过Minor GC后进⼊⽼年代的平均⼤⼩⼤于⽼年代的可⽤内存
(5)由Eden区、From Space区向To Space区复制时,对象⼤⼩⼤于
To Space可⽤内存,则把该对象转存到⽼年代,且⽼年代的可⽤内存⼩
于该对象⼤⼩
30. jvm中哪些地⽅会出现oom?分别说说oom的可能原因?
jvm发⽣oom的四种情
况:blog.csdn/QQ578473688/article/details/77752080
31. 我们如何发现oom来⾃jvm中哪个区域?
32. 有没有jvm调优经验?调优⽅案有哪些?
33. 调优时机:
a. heap 内存(⽼年代)持续上涨达到设置的最⼤内存值;
b. Full GC 次数频繁;
c. GC 停顿时间过⻓(超过1秒);
d. 应⽤出现OutOfMemory 等内存异常;
e. 应⽤中有使⽤本地缓存且占⽤⼤量内存空间;
f. 系统吞吐量与响应性能不⾼或下降。
34. 调优原则:
a. 多数的Java应⽤不需要在服务器上进⾏JVM优化;
b. 多数导致GC问题的Java应⽤,都不是因为我们参数设置错误,
⽽是代码问题;
c. 在应⽤上线之前,先考虑将机器的JVM参数设置到最优(最适
合);
d. 减少创建对象的数量;
e. 减少使⽤全局变量和⼤对象;
f. JVM优化是到最后不得已才采⽤的⼿段;
g. 在实际使⽤中,分析GC情况优化代码⽐优化JVM参数更好;
35. 调优⽬标:
a. GC低停顿;
b. GC低频率;
c. 低内存占⽤;
d. ⾼吞吐量;
36. 调优步骤:
a. 分析GC⽇志及dump⽂件,判断是否需要优化,确定瓶颈问题
点;
b. 确定jvm调优量化⽬标;
c. 确定jvm调优参数(根据历史jvm参数来调整);
d. 调优⼀台服务器,对⽐观察调优前后的差异;
e. 不断的分析和调整,知道到合适的jvm参数配置;
f. 到最合适的参数,将这些参数应⽤到所有服务器,并进⾏后续
跟踪。
37. 平时有没有看过什么源码,请画出来。
深⼊理解:juejin.im/post/5caef238e51d456e27504b83
38. 有没有写过或者看过custom classloader?
了解⼀下即可:www.jianshu/p/3036b46f1188
39. 介绍你最近做的⼀个项⽬,画出框架图并分析业务流程。
40. 平时看过那些书?