Skip to content

Commit 101de7e

Browse files
committed
HashMap内存溢出
1 parent adc688f commit 101de7e

File tree

3 files changed

+65
-9
lines changed

3 files changed

+65
-9
lines changed

README.md

+13-8
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,19 @@ Senior Java engineer interview exams in 2019
138138

139139
* 自己查漏补缺
140140

141-
* sql遗漏知识点
141+
* [微服务调用超时的处理方案](readme/call-timeout-process.md)
142+
143+
* sql遗漏知识点
144+
145+
答案: exists与in的区别和各自的应用场景是什么? having的作用是什么?
146+
truncate与delete的区别.
147+
Oracle的over(), partition by的使用。partition by与group by的区别。
148+
149+
* valotile关键字有什么作用
150+
151+
* duboo或者spring cloud微服务调用超时应该怎么处理
142152

143-
答案: exists与in的区别和各自的应用场景是什么? having的作用是什么?
144-
truncate与delete的区别.
145-
Oracle的over(), partition by的使用。partition by与group by的区别。
146153

147-
* valotile关键字有什么作用
148-
149154
<hr/>
150155

151156
* 京东金融
@@ -256,10 +261,10 @@ String s = " z111,c888,n222,,,g000, t333,a999,c888 ,p000 ,z111 ";
256261

257262
*1.[Spring bean依赖注入的时候怎么解决bean之间的循环引用问题](https://www.cnblogs.com/bhlsheji/p/5208076.html)
258263

259-
*2.如何自己去实现一个WEB框架,怎么实现类似于SpringMVC里的@RequestMapping
264+
*2.如何自己去实现一个WEB框架,怎么实现类似于SpringMVC里的@RequestMapping,用什么匹配算法速度最快
260265

261266
* 拍拍贷
262-
* [使用HashMap的时候如何避免内存泄漏](readme/)
267+
* [使用HashMap的时候如何避免内存泄漏](readme/hashmap-memory-leak.md)
263268

264269
## 更多Java面试题
265270

readme/call-timeout-process.md

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# 微服务调用超时处理
2+
3+
* 服务之间调用的交互模式
4+
* 同步
5+
* 异步
6+
* 消息队列
7+
8+
* 最简单的处理策略
9+
10+
微服务调用,一般是使用同步调用。通常的做法是超时几次后采用熔断策略。
11+
12+
下面讨论更高级的处理方式,方案会复杂些,实现成本也略高
13+
14+
15+
[微服务调用超时处理-高级方案](https://www.jianshu.com/p/d68d572b0613)
16+
17+
转载网友的博客,下面贴出关键点
18+
19+
* 同步超时
20+
21+
超时可能发生的点
22+
23+
在同步调用的模式下,超时可能发生的节点有以下三处:
24+
25+
请求超时,客户端给服务端发送请求时超时,此时服务端没有收到客户端的请求;
26+
服务端内部超时,服务端可能存在DB操作、IO操作、调用其他服务超时;
27+
响应超时,服务端给客户端返回响应时超时,此时服务端已经处理了请求。
28+
29+
### 客户端
30+
无论是何种超时,对于客户端来说都是透明的,即客户端无法知道具体发生超时的点。客户端对于超时的处理,有如下两种常见方法:
31+
32+
* 查询,通过主动查询去拉取超时请求的状态。这种方法需要服务端提供查询接口,并且是根据客户端生成的请求流水号作为查询的条件,因为同一个服务或者接口可能会存在多个调用方,这就需要服务端能够唯一标识某一个客户端请求。
33+
34+
35+
如何唯一标识客户端请求,有以下两种方案可供参考.
36+
1. 全局流水号(traceId),全局流水号需要在所有调用方之间唯一,这可能需要在全公司层面有分布式发号器的应用。
37+
2. 如果在调用方的应用有不属于公司的应用,那么全局流水号可能就不好控制了,这个时候可以使用:productId+productSeqId的组合形式。productId表示接入方的系统号,productSeqId表示接入方的流水号,productSeqId需要保证在同一个productId内是唯一的。这样服务端就可以通过productId + productSeqId来唯一标识客户端的请求。
38+
39+
40+
* 重试,需要设置重试梯度(5s,30s,1min...),以及重试次数的阈值(最多重试的次数)。另外,客户端的重试需要服务端支持幂等(多次执行和只执行一次的效果一样)。
41+
42+
### 服务端
43+
对于①.请求超时和③.响应超时服务端是无法感知的,也就没法进行处理。而在②.服务端内部超时时服务端应该快速失败,立即响应客户端。如果是服务端调用其他服务(例如,服务C)超时,服务端除了快速失败之外,还需要调用服务C的冲正操作。
44+
45+
46+
47+
48+
49+
服务端内部调用其他服务超时
50+
51+
服务C的冲正接口需要能够判断之前是否接收过服务端超时的请求,如果接收过请求并做了处理,则应该执行反向的回滚操作,如果没有接收过,则忽略冲正请求。

readme/hashmap-memory-leak.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 使用HashMap的时候如何避免内存泄漏
22

3-
当Key为复杂类型(自定义对象)的时候,如果map.put(obj, value)后
3+
当HashMap的Key为复杂类型(自定义对象)的时候,如果map.put(obj, value)后
44
如果修改了obj中的某些字段值,而且这这个字段会导致obj.hashCode()发送变化的。就必定导致内存泄漏。
55
因为Node数据的存放地址没变,但是里面的key变了。
66

0 commit comments

Comments
 (0)