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(字符串)
    List(列表)
    Hash(字典)
    Set(集合)
    Sorted Set(有序集合)
    区别
    1、memcache⽀持k/v类型数据;
    2、redis除了缓存k/v类型数据之外,还能缓存list、set、hash等数据结构
    的数据;
    3.redis的持久化,事务,master/salver这些虽然也是redis的优势,但实际应
    ⽤中发现这些其实是会托累服务器的性能,⽽我们全部都不能⽤.我们得⾃已做;
    memcached以上都不管,我们也得⾃已做;
    4.如果需要在服务器端做⼀些聚合的运算,⽤redis;如果只是做缓存,redis虽
    然可以,但性能很差.在要求⾼性能的环境下使⽤memcached更合适;
    10.消息队列有⽤到吗?具体在项⽬中是怎么⽤的?如何保证消息的可靠传递?
    详⻅“⾯试题库/RabbitMQ”
    0304 乐信
    微服务框架⽤的dubbo
  18. 说说java集合,每个集合下⾯有哪些实现类,及其数据结构?
    深⼊理解这篇:https://www.jianshu.com/p/63e76826e852
  19. 介绍⼀下红⿊树、⼆叉平衡树。
    理解这篇:https://juejin.im/post/5a27c6946fb9a04509096248
  20. jdk1.8中ConcurrentHashMap size⼤于8时会转化成红⿊树,请问有什么
    作⽤,如果通过remove操作,size⼩于8了,会发⽣什么?
  21. 说说java同步机制,java有哪些锁,每个锁的特性?
    看这篇:https://blog.csdn.net/vking_wang/article/details/9952063
  22. 说说volatile如何保证可⻅性,从cpu层⾯分析。
    需深⼊理解:https://juejin.im/post/5ae9b41b518825670b33e6c4
  23. spring加载bean的顺序?
    spring容器及bean加载机制源码解
    读:https://blog.csdn.net/songyang19871115/article/details/54342242
  24. 哪些对象会被存放到⽼年代?
  25. 新⽣代对象每次经历⼀次minor gc,年龄会加1,当达到年龄阈值
    (默认为15岁)会直接进⼊⽼年代;
  26. ⼤对象直接进⼊⽼年代;
  27. 新⽣代复制算法需要⼀个survivor区进⾏轮换备份,如果出现⼤量对
    象在minor gc后仍然存活的情况时,就需要⽼年代进⾏分配担保,让
    survivor⽆法容纳的对象直接进⼊⽼年代;
  28. 如果在Survivor空间中相同年龄所有对象⼤⼩的总和⼤于Survivor空
    间的⼀半,年龄⼤于或等于该年龄的对象就可以直接进⼊年⽼代。
  29. 什么时候触发full gc?
    (1)调⽤System.gc时,系统建议执⾏Full GC,但是不必然执⾏
    (2)⽼年代空间不⾜
    (3)⽅法去空间不⾜
    (4)通过Minor GC后进⼊⽼年代的平均⼤⼩⼤于⽼年代的可⽤内存
    (5)由Eden区、From Space区向To Space区复制时,对象⼤⼩⼤于
    To Space可⽤内存,则把该对象转存到⽼年代,且⽼年代的可⽤内存⼩
    于该对象⼤⼩
  30. jvm中哪些地⽅会出现oom?分别说说oom的可能原因?
    jvm发⽣oom的四种情
    况:https://blog.csdn.net/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. 平时有没有看过什么源码,请画出来。
    深⼊理解:https://juejin.im/post/5caef238e51d456e27504b83
  38. 有没有写过或者看过custom classloader?
    了解⼀下即可:https://www.jianshu.com/p/3036b46f1188
  39. 介绍你最近做的⼀个项⽬,画出框架图并分析业务流程。
  40. 平时看过那些书?

你可能感兴趣的:(java,Java面试,Java面试题,面试题,面试)