Java面试题总结

最近正值春招,收集了下平时遇到的 Java 技术问题或周围朋友见过的面试题,经过不断筛选,终于凝练成一套实用的小题库。

想用它来挖掘我在 Java 技术栈中的技术盲点,然后修复和完善它,以此来提高自己的技术水平。

 

我总结的这 200+ 道几乎都是「必考题」,都能看懂的话,如果去面试就十拿九稳了。刚开始的时候我还觉得这么做是不是帮人「作弊」的嫌疑,最后我想通了,这是一件值得去做的事儿。

  • 第一:让更多的人因此而学到了更多的知识,这是一件大好事。

  • 第二:这只是经验的高度提炼,让那些原本就掌握了技术却不知道怎么表达的人,学会如何在面试中展示自己。

  • 第三:如果只是死记硬背这些面试题,只要面试官再深入问纠一下,也可对这个人有一个准确的认识,之前说的“帮人作弊”的事就不存在了。

  • 第四:学习有很多种方式,但只有好学者才会临池学书。如果是不想学的人,提供再多再好的资料放在他们的面前,他们也会视而不见。

就拿我们这份 Java 题来说,你如果能记住其中大部分的答案说明,第一,你很聪明并且记性还很好;第二,说明你有上进心,也愿意学习;第三,有了这份面试题做理论支撑之后,即使你的实践经验没有那么多,但懂得原理的你,做出来的程序也一定不会太差。

所以如果您是面试官,恰好又看到这里,如果条件允许的话,请多给这样愿意学又很聪明的年轻人多一些机会。

面试题模块介绍

说了这么多,直奔主题,我们这份面试题,包含了十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 等等。如下图所示:

Java面试题总结_第1张图片

可能对于初学者不需要看后面的框架和 JVM 模块的知识,读者朋友们可根据自己的情况,选择对应的模块进行阅读。

适宜阅读人群

  • 需要面试的初/中/高级 Java 程序员

  • 想要查漏补缺的人

  • 想要不断完善扩充自己 Java 技术栈的人

  • Java 面试官

具体面试题

Java 基础

1. JDK 和 JRE 有什么区别?

2. == 和 equals 的区别是什么?

3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

4. final 在 java 中有什么作用?

5. java 中的 Math.round(-1.5) 等于多少?

6. String 属于基础的数据类型吗?

7. java 中操作字符串都有哪些类?它们之间有什么区别?

8. String str="i"与 String str=new String(“i”)一样吗?

9. 如何将字符串反转?

10. String 类的常用方法都有那些?

11. 抽象类必须要有抽象方法吗?

12. 普通类和抽象类有哪些区别?

13. 抽象类能使用 final 修饰吗?

14. 接口和抽象类有什么区别?

15. java 中 IO 流分为几种?

16. BIO、NIO、AIO 有什么区别?

17. Files的常用方法都有哪些?

常用的数组或集合有哪些, 有什么区别?

循环hashmap的值有几种方式?

list 排除重复数据有几种方式,那种更高效,为什么?

poi导入导出如何区分03和07版Word/Excel?

maven常用命令有哪些?本地仓库在哪儿配置?

循环(for)里面是否能为list数组添加或删除元素?

 

 

容器

18. java 容器都有哪些?

19. Collection 和 Collections 有什么区别?

20. List、Set、Map 之间的区别是什么?

21. HashMap 和 Hashtable 有什么区别?

22. 如何决定使用 HashMap 还是 TreeMap?

23. 说一下 HashMap 的实现原理?

24. 说一下 HashSet 的实现原理?

25. ArrayList 和 LinkedList 的区别是什么?

26. 如何实现数组和 List 之间的转换?

27. ArrayList 和 Vector 的区别是什么?

28. Array 和 ArrayList 有何区别?

29. 在 Queue 中 poll()和 remove()有什么区别?

30. 哪些集合类是线程安全的?

31. 迭代器 Iterator 是什么?

32. Iterator 怎么使用?有什么特点?

33. Iterator 和 ListIterator 有什么区别?

34. 怎么确保一个集合不能被修改?

 

多线程

35. 并行和并发有什么区别?

36. 线程和进程的区别?

37. 守护线程是什么?

38. 创建线程有哪几种方式, 多线程使用场景有哪些?

39. 说一下 runnable 和 callable 有什么区别?

40. 线程有哪些状态?

41. sleep() 和 wait() 有什么区别?

42. notify()和 notifyAll()有什么区别?

43. 线程的 run()和 start()有什么区别?

44.创建线程池有哪几种方式?

45.线程池都有哪些状态?

46. 线程池中 submit()和 execute()方法有什么区别?

47. 在 java 程序中怎么保证多线程的运行安全?

48. 多线程锁的升级原理是什么?

49. 什么是死锁?

50. 怎么防止死锁?

51. ThreadLocal 是什么?有哪些使用场景?

52. 说一下 synchronized 底层实现原理?

53. synchronized 和 volatile 的区别是什么?

54. synchronized 和 Lock 有什么区别?

55. synchronized 和 ReentrantLock 区别是什么?

56. 说一下 atomic 的原理?

 

反射

57. 什么是反射?

58. 什么是 java 序列化?什么情况下需要序列化?

59. 动态代理是什么?有哪些应用?

60. 怎么实现动态代理?

 

对象拷贝

61. 为什么要使用克隆?

62. 如何实现对象克隆?

63. 深拷贝和浅拷贝区别是什么?

 

Java Web

64. jsp 和 servlet 有什么区别?

65. jsp 有哪些内置对象?作用分别是什么?

66. 说一下 jsp 的 4 种作用域?

67. session 和 cookie 有什么区别?

68. 说一下 session 的工作原理?

69. 如果客户端禁止 cookie 能实现 session 还能用吗?

70. spring mvc 和 struts 的区别是什么?

71. 如何避免 sql 注入?

72. 什么是 XSS 攻击,如何避免?

73. 什么是 CSRF 攻击,如何避免?

 

异常

74. throw 和 throws 的区别?

75. final、finally、finalize 有什么区别?

76. try-catch-finally 中哪个部分可以省略?

77. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

78. 常见的异常类有哪些?

 

网络

79. http 响应码 301 和 302 代表的是什么?有什么区别?

80. forward 和 redirect 的区别?

81. 简述 tcp 和 udp的区别?

82. tcp 为什么要三次握手,两次不行吗?为什么?

83. 说一下 tcp 粘包是怎么产生的?

84. OSI 的七层模型都有哪些?

85. get 和 post 请求有哪些区别?

86. 如何实现跨域?

87. 说一下 JSONP 实现原理?

错误码 200, 400, 500, 404 类型及含义?

 

设计模式

88. 说一下你熟悉的设计模式?

89. 简单工厂和抽象工厂有什么区别?

 

Spring/Spring MVC

90. 为什么要使用 spring, spring常用的注解有哪些?

91. 解释一下什么是 aop,及AOP的使用场景有哪些?

92. 解释一下什么是 ioc,IOC的底层原理?

93. spring 有哪些主要模块?

94. spring 常用的注入方式有哪些?

95. spring 中的 bean 是线程安全的吗?

96. spring 支持几种 bean 的作用域?

97. spring 自动装配 bean 有哪些方式?

98. spring 事务实现方式有哪些?

99. 说一下 spring 的事务隔离?

100. 说一下 spring mvc 运行流程?

101. spring mvc 有哪些组件?

102. @RequestMapping 的作用是什么?

103. @Autowired 的作用是什么?

 

Spring Boot/Spring Cloud

104. 什么是 spring boot?

105. 为什么要用 spring boot?

106. spring boot 核心配置文件是什么?

107. spring boot 配置文件有哪几种类型?它们有什么区别? 如何配置不同环境的调用?

108. spring boot 有哪些方式可以实现热部署?

109. jpa 和 hibernate 有什么区别?

110. 什么是 spring cloud,它的组件有哪些?

111. spring cloud 断路器的作用是什么?

112. spring cloud 的核心组件有哪些?

分布式服务之间如何相互调用?会有哪些异常情况,如何解决?

分布式事务如何实现?

分布式锁如何实现? 分布式锁有什么作用?

 

Hibernate

113. 为什么要使用 hibernate?

114. 什么是 ORM 框架?

115. hibernate 中如何在控制台查看打印的 sql 语句?

116. hibernate 有几种查询方式?

117. hibernate 实体类可以被定义为 final 吗?

118. 在 hibernate 中使用 Integer 和 int 做映射有什么区别?

119. hibernate 是如何工作的?

120. get()和 load()的区别?

121. 说一下 hibernate 的缓存机制?

122. hibernate 对象有哪些状态?

123. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

124. hibernate 实体类必须要有无参构造函数吗?为什么?

 

Mybatis

125. mybatis 中 #{}和 ${}的区别是什么?

126. mybatis的组件有哪些? mybatis 有几种分页方式?

127. RowBounds 是一次性查询全部结果吗?为什么?

128. mybatis 逻辑分页和物理分页的区别是什么?

129. mybatis 是否支持延迟加载?延迟加载的原理是什么?

130. 说一下 mybatis 的一级缓存和二级缓存?

131. mybatis 和 hibernate 的区别有哪些?

132. mybatis 有哪些执行器(Executor)?

133. mybatis 分页插件的实现原理是什么?

134. mybatis 如何编写一个自定义插件?

假如你的系统中要做数据权限处理,数据权限如何实现?

 

RabbitMQ

135. rabbitmq 的使用场景有哪些?

136. rabbitmq 有哪些重要的角色?

137. rabbitmq 有哪些重要的组件?

138. rabbitmq 中 vhost 的作用是什么?

139. rabbitmq 的消息是怎么发送的?

140. rabbitmq 怎么保证消息的稳定性?

141.rabbitmq 怎么避免消息丢失?

142. 要保证消息持久化成功的条件有哪些?

143. rabbitmq 持久化有什么缺点?

144. rabbitmq 有几种广播类型?

145. rabbitmq 怎么实现延迟消息队列?

146. rabbitmq 集群有什么用?

147. rabbitmq 节点的类型有哪些?

148. rabbitmq 集群搭建需要注意哪些问题?

149. rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?

150. rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?

151. rabbitmq 对集群节点停止顺序有要求吗?

 

Kafka

152. kafka 可以脱离 zookeeper 单独使用吗?为什么?

153. kafka 有几种数据保留的策略?

154. kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?

155. 什么情况会导致 kafka 运行变慢?

156. 使用 kafka 集群需要注意什么?

kafka 消息列队如何设置?

 

Zookeeper

157. zookeeper 是什么?

158. zookeeper 都有哪些功能?

159. zookeeper 有几种部署模式?

160. zookeeper 怎么保证主从节点的状态同步?

161. 集群中为什么要有主节点?

162. 集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?

163. 说一下 zookeeper 的通知机制?

 

MySql

164. 数据库的三范式是什么?

165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

166. 如何获取当前数据库版本?

167. 说一下 ACID 是什么?

168. char 和 varchar 的区别是什么?

169. float 和 double 的区别是什么?

170. mysql 的内连接、左连接、右连接有什么区别?

171. mysql 索引是怎么实现的?

172. 怎么验证 mysql 的索引是否满足需求?

173. 说一下数据库的事务隔离?

174. 说一下 mysql 常用的引擎?

175. 说一下 mysql 的行锁和表锁?

176. 说一下乐观锁和悲观锁?

177. mysql 问题排查都有哪些手段?

178. 如何做 mysql 的性能优化?

你的sql关联了多少张表,查询慢了如何优化?

 

Redis

使用过哪些缓存机制,他们有什么区别,为什么要使用某缓存?

179. redis 是什么?都有哪些使用场景?

180. redis 有哪些功能?

181. redis 和 memecache 有什么区别?

182. redis 为什么是单线程的?

183. 什么是缓存穿透?怎么解决?

184. redis 支持的数据类型有哪些?

185. redis 支持的 java 客户端都有哪些?

186. jedis 和 redisson 有哪些区别?

187. 怎么保证缓存和数据库数据的一致性?

188. redis 持久化有几种方式?

189.redis 怎么实现分布式锁?

190. redis 分布式锁有什么缺陷?

191. redis 如何做内存优化?

192. redis 淘汰策略有哪些?

193. redis 常见的性能问题有哪些?该如何解决?

 

JVM

194. 说一下 jvm 的主要组成部分?及其作用?

195. 说一下 jvm 运行时数据区?

196. 说一下堆栈的区别?

197. 队列和栈是什么?有什么区别?

198. 什么是双亲委派模型?

199. 说一下类加载的执行过程?

200. 怎么判断对象是否可以被回收?

201. java 中都有哪些引用类型?

202. 说一下 jvm 有哪些垃圾回收算法?

203. 说一下 jvm 有哪些垃圾回收器?

204. 详细介绍一下 CMS 垃圾回收器?

205. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

206. 简述分代垃圾回收器是怎么工作的?

207. 说一下 jvm 调优的工具?

208. 常用的 jvm 调优的参数都有哪些?

 

综合:

商城的主要功能有哪些?模块会有哪几部分,如何划分?

购物车的实现方式有哪些?说说实现原理?

如何设计一个消息中间件?

接口调用时,银行的公钥和私钥或数字证书有何用处?

 

 

 

Java面试题总结_第2张图片

Java面试题

1、如何理解Java的多态?其中,重载和重写有什么区别?

多态是同一个行为具有多个不同表现形式或形态的能力,多态是同一个接口,使用不同的实例而执行不同操作,多态就是程序运行期间才确定,一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法。
多态存在的三个必要条件是:继承,重写,父类引用指向子类引用。
多态的三个实现方式是:重写,接口,抽象类和抽象方法。
重写(Override)和重载(Overload)的区别

Java面试题总结_第3张图片

2、谈一下JVM内存区域划分?哪部分是线程公有的,哪部分是私有的?

JVM 的内存区域可以分为两类:线程私有和区域和线程共有的区域。 线程私有的区域:程序计数器、JVM 虚拟机栈、本地方法栈;线程共有的区域:堆、方法区、运行时常量池。

程序计数器,也有称作PC寄存器。每个线程都有一个私有的程序计数器,任何时间一个线程都只会有一个方法正在执行,也就是所谓的当前方法。程序计数器存放的就是这个当前方法的JVM指令地址。当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。

JVM虚拟机栈。创建线程的时候会创建线程内的虚拟机栈,栈中存放着一个个的栈帧,对应着一个个方法的调用。JVM 虚拟机栈有两种操作,分别是压栈和出站。栈帧中存放着局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息。

本地方法栈。本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。在JVM规范中,并没有对本地方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

堆。堆是内存管理的核心区域,用来存放对象实例。几乎所有创建的对象实例都会直接分配到堆上。所以堆也是垃圾回收的主要区域,垃圾收集器会对堆有着更细的划分,最常见的就是把堆划分为新生代和老年代。java堆允许处于不连续的物理内存空间中,只要逻辑连续即可。堆中如果没有空间完成实例分配无法扩展时将会抛出OutOfMemoryError异常。

方法区。方法区与堆一样所有线程所共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。
其实除了程序计数器,其他的部分都会发生 OOM。

堆。 通常发生的 OOM 都会发生在堆中,最常见的可能导致 OOM 的原因就是内存泄漏。
JVM虚拟机栈和本地方法栈。 当我们写一个递归方法,这个递归方法没有循环终止条件,最终会导致  StackOverflow 的错误。当然,如果栈空间扩展失败,也是会发生 OOM 的。
方法区。方法区现在基本上不太会发生 OOM,但在早期内存中加载的类信息过多的情况下也是会发生 OOM 的。

3、final关键字的用法?

final 可以修饰类、变量和方法。修饰类代表这个类不可被继承。修饰变量代表此变量不可被改变。修饰方法表示此方法不可被重写 (override)。

4、死锁是怎么导致的?如何定位死锁

某个任务在等待另一个任务,而后者又等待别的任务,这样一直下去,直到这个链条上的任务又在等待第一个任务释放锁。这得到了一个任务之间互相等待的连续循环,没有哪个线程能继续。这被称之为死锁。当以下四个条件同时满足时,就会产生死锁:
(1) 互斥条件。任务所使用的资源中至少有一个是不能共享的。
(2) 任务必须持有一个资源,同时等待获取另一个被别的任务占有的资源。
(3) 资源不能被强占。
(4) 必须有循环等待。一个任务正在等待另一个任务所持有的资源,后者又在等待别的任务所持有的资源,这样一直下去,直到有一个任务在等待第一个任务所持有的资源,使得大家都被锁住。
要解决死锁问题,必须打破上面四个条件的其中之一。在程序中,最容易打破的往往是第四个条件。

5、数据库如何进行升级?SQLite增删改查的基础sql语句?

    public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
        this(context, name, factory, version, null);
    }

    public SQLiteDatabase getWritableDatabase() {
        synchronized (this) {
            return getDatabaseLocked(true);
        }
    }

  private SQLiteDatabase getDatabaseLocked(boolean writable) {
      .......
      db.beginTransaction();
      try {
              if (version == 0) {
                   onCreate(db);
              } else {
                   if (version > mNewVersion) {
                         onDowngrade(db, version, mNewVersion);
                   } else {
                         onUpgrade(db, version, mNewVersion);
                   }
              }
               db.setVersion(mNewVersion);
                db.setTransactionSuccessful();
              } finally {
                 db.endTransaction();
              }
  }

 

在SQLiteOpenHelper的构造函数中,包含了一个version的参数。这个参数即是数据库的版本。 所以,我们可以通过修改version来实现数据库的升级。 当version大于原数据库版本时,onUpgrade()会被触发,可以在该方法中编写数据库升级逻辑。具体的数据库升级逻辑示例可参考这里。
常用的SQL增删改查:

  • 增:INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,….)

  • 删: DELETE FROM 表名称 WHERE 列名称 = 值

  • 改:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

  • 查:SELECT 列名称(通配是*符号) FROM 表名称

ps:操作数据表是:ALTER TABLE。该语句用于在已有的表中添加、修改或删除列。
ALTER TABLE table_name ADD column_name datatype
ALTER TABLE table_name DROP COLUMN column_name
ALTER TABLE table_name_old RENAME TO table_name_new

 

Dubbo面试题:

dubbo是什么

dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

dubbo能做什么

透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

1、默认使用的是什么通信框架,还有别的选择吗?

答:默认也推荐使用 netty 框架,还有 mina。

2、服务调用是阻塞的吗?

答:默认是阻塞的,可以异步调用,没有返回值的可以这么做。

3、一般使用什么注册中心?还有别的选择吗?

答:推荐使用 zookeeper 注册中心,还有 Multicast注册中心, Redis注册中心, Simple注册中心.

ZooKeeper的节点是通过像树一样的结构来进行维护的,并且每一个节点通过路径来标示以及访问。除此之外,每一个节点还拥有自身的一些信息,包括:数据、数据长度、创建时间、修改时间等等。

4、默认使用什么序列化框架,你知道的还有哪些?

答:默认使用 Hessian 序列化,还有 Duddo、FastJson、Java 自带序列化。 hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速。

Hessian原理与协议简析:

http的协议约定了数据传输的方式,hessian也无法改变太多:

1) hessian中client与server的交互,基于http-post方式。

2) hessian将辅助信息,封装在http header中,比如“授权token”等,我们可以基于http-header来封装关于“安全校验”“meta数据”等。hessian提供了简单的”校验”机制。

3) 对于hessian的交互核心数据,比如“调用的方法”和参数列表信息,将通过post请求的body体直接发送,格式为字节流。

4) 对于hessian的server端响应数据,将在response中通过字节流的方式直接输出。

hessian的协议本身并不复杂,在此不再赘言;所谓协议(protocol)就是约束数据的格式,client按照协议将请求信息序列化成字节序列发送给server端,server端根据协议,将数据反序列化成“对象”,然后执行指定的方法,并将方法的返回值再次按照协议序列化成字节流,响应给client,client按照协议将字节流反序列话成”对象”。

5、服务提供者能实现失效踢出是什么原理?

答:服务失效踢出基于 zookeeper 的临时节点原理。

6、服务上线怎么不影响旧版本?

答:采用多版本开发,不影响旧版本。在配置中添加version来作为版本区分

7、如何解决服务调用链过长的问题?

答:可以结合 zipkin 实现分布式服务追踪。

8、说说核心的配置有哪些?

核心配置有:

1) dubbo:service/

2) dubbo:reference/

3) dubbo:protocol/

4) dubbo:registry/

5) dubbo:application/

6) dubbo:provider/

7) dubbo:consumer/

8) dubbo:method/

9、dubbo 推荐用什么协议?

答:默认使用 dubbo 协议。

10、同一个服务多个注册的情况下可以直连某一个服务吗?

答:可以直连,修改配置即可,也可以通过 telnet 直接某个服务。

11、dubbo 在安全机制方面如何解决的?

dubbo 通过 token 令牌防止用户绕过注册中心直连,然后在注册中心管理授权,dubbo 提供了黑白名单,控制服务所允许的调用方。

12、集群容错怎么做?

答:读操作建议使用 Failover 失败自动切换,默认重试两次其他服务器。写操作建议使用 Failfast 快速失败,发一次调用失败就立即报错。

13、在使用过程中都遇到了些什么问题? 如何解决的?

1) 同时配置了 XML 和 properties 文件,则 properties 中的配置无效

只有 XML 没有配置时,properties 才生效。

2) dubbo 缺省会在启动时检查依赖是否可用,不可用就抛出异常,阻止 spring 初始化完成,check 属性默认为 true。

测试时有些服务不关心或者出现了循环依赖,将 check 设置为 false

3) 为了方便开发测试,线下有一个所有服务可用的注册中心,这时,如果有一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。

解决:让服务提供者开发方,只订阅服务,而不注册正在开发的服务,通过直连测试正在开发的服务。设置 dubbo:registry 标签的 register 属性为 false。

4) spring 2.x 初始化死锁问题。

在 spring 解析到 dubbo:service 时,就已经向外暴露了服务,而 spring 还在接着初始化其他 bean,如果这时有请求进来,并且服务的实现类里有调用 applicationContext.getBean() 的用法。getBean 线程和 spring 初始化线程的锁的顺序不一样,导致了线程死锁,不能提供服务,启动不了。

解决:不要在服务的实现类中使用 applicationContext.getBean(); 如果不想依赖配置顺序,可以将 dubbo:provider 的 deplay 属性设置为 - 1,使 dubbo 在容器初始化完成后再暴露服务。

5) 服务注册不上

检查 dubbo 的 jar 包有没有在 classpath 中,以及有没有重复的 jar 包

检查暴露服务的 spring 配置有没有加载

在服务提供者机器上测试与注册中心的网络是否通

6) 出现 RpcException: No provider available for remote service 异常

表示没有可用的服务提供者,

a. 检查连接的注册中心是否正确

b. 到注册中心查看相应的服务提供者是否存在

c. 检查服务提供者是否正常运行

7) 出现” 消息发送失败” 异常

通常是接口方法的传入传出参数未实现 Serializable 接口。

14、dubbo 和 dubbox 之间的区别?

答:dubbox 是当当网基于 dubbo 上做了一些扩展,如加了服务可 restful 调用,更新了开源组件等。

15、你还了解别的分布式框架吗?

答:别的还有 spring 的 spring cloud,facebook 的 thrift,twitter 的 finagle 等。

16、Dubbo 支持哪些协议,每种协议的应用场景,优缺点?

dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化;

rmi: 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。 多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作。在依赖低版本的 Common-Collections 包,java 序列化存在安全漏洞;

webservice:基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用;http: 基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器 JS 调用; hessian: 集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 作为服务器时默认实现,提供与 Hession 服务互操作。多个短连接,同步 HTTP 传输,Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;

memcache: 基于 memcached 实现的 RPC 协议 redis: 基于 redis 实现的 RPC 协议

17、Dubbo 集群的负载均衡有哪些策略  

Dubbo 提供了常见的集群策略实现,并预扩展点予以自行实现。

Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀;

RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题;

LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求; ConstantHash LoadBalance: 一致性 Hash 策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动;

18、服务调用超时问题怎么解决

dubbo在调用服务不成功时,默认是会重试两次的。这样在服务端的处理时间超过了设定的超时时间时,就会有重复请求,比如在发邮件时,可能就会发出多份重复邮件,执行注册请求时,就会插入多条重复的注册数据,那么怎么解决超时问题呢?如下

对于核心的服务中心,去除dubbo超时重试机制,并重新评估设置超时时间。 业务处理代码必须放在服务端,客户端只做参数验证和服务调用,不涉及业务流程处理 全局配置实例

当然Dubbo的重试机制其实是非常好的QOS保证,它的路由机制,是会帮你把超时的请求路由到其他机器上,而不是本机尝试,所以 dubbo的重试机器也能一定程度的保证服务的质量。但是请一定要综合线上的访问情况,给出综合的评估。

 

Kafka 面试题:

  • Kafka的用途有哪些?使用场景如何?

  • Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么

  • Kafka中的HW、LEO、LSO、LW等分别代表什么?

  • Kafka中是怎么体现消息顺序性的?

  • Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?

  • Kafka生产者客户端的整体结构是什么样子的?

  • Kafka生产者客户端中使用了几个线程来处理?分别是什么?

  • Kafka的旧版Scala的消费者客户端的设计有什么缺陷?

  • “消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?如果不正确,那么有没有什么hack的手段?

  • 消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?

  • 有哪些情形会造成重复消费?

  • 那些情景下会造成消息漏消费?

  • KafkaConsumer是非线程安全的,那么怎么样实现多线程消费?

  • 简述消费者与消费组之间的关系

  • 当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?

  • topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?

  • topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?

  • 创建topic时如何选择合适的分区数?

  • Kafka目前有那些内部topic,它们都有什么特征?各自的作用又是什么?

  • 优先副本是什么?它有什么特殊的作用?

  • Kafka有哪几处地方有分区分配的概念?简述大致的过程及原理

  • 简述Kafka的日志目录结构

  • Kafka中有那些索引文件?

  • 如果我指定了一个offset,Kafka怎么查找到对应的消息?

  • 如果我指定了一个timestamp,Kafka怎么查找到对应的消息?

  • 聊一聊你对Kafka的Log Retention的理解

  • 聊一聊你对Kafka的Log Compaction的理解

  • 聊一聊你对Kafka底层存储的理解(页缓存、内核层、块层、设备层)

  • 聊一聊Kafka的延时操作的原理

  • 聊一聊Kafka控制器的作用

  • 消费再均衡的原理是什么?(提示:消费者协调器和消费组协调器)

  • Kafka中的幂等是怎么实现的

  • Kafka中的事务是怎么实现的(这题我去面试6加被问4次,照着答案念也要念十几分钟,面试官简直凑不要脸。实在记不住的话...只要简历上不写精通Kafka一般不会问到,我简历上写的是“熟悉Kafka,了解RabbitMQ....”)

  • Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?

  • 失效副本是指什么?有那些应对措施?

  • 多副本下,各个副本中的HW和LEO的演变过程

  • 为什么Kafka不支持读写分离?

  • Kafka在可靠性方面做了哪些改进?(HW, LeaderEpoch)

  • Kafka中怎么实现死信队列和重试队列?

  • Kafka中的延迟队列怎么实现(这题被问的比事务那题还要多!!!听说你会Kafka,那你说说延迟队列怎么实现?)

  • Kafka中怎么做消息审计?

  • Kafka中怎么做消息轨迹?

  • Kafka中有那些配置参数比较有意思?聊一聊你的看法

  • Kafka中有那些命名比较有意思?聊一聊你的看法

  • Kafka有哪些指标需要着重关注?

  • 怎么计算Lag?(注意read_uncommitted和read_committed状态下的不同)

  • Kafka的那些设计让它有如此高的性能?

  • Kafka有什么优缺点?

  • 还用过什么同质类的其它产品,与Kafka相比有什么优缺点?

  • 为什么选择Kafka?

  • 在使用Kafka的过程中遇到过什么困难?怎么解决的?

  • 怎么样才能确保Kafka极大程度上的可靠性?

  • 聊一聊你对Kafka生态的理解

以上是个人阅读资料后整理总结,后续在补充:

你可能感兴趣的:(#,Java基础,Java面试技巧)