Skip to content

Commit 21df0fb

Browse files
committed
docs: 更新文档中的图片链接
1 parent 248fa12 commit 21df0fb

File tree

89 files changed

+611
-548
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+611
-548
lines changed

docs/00.笔记/分布式/分布式理论/数据密集型应用系统设计笔记一.md

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ permalink: /pages/ea0d9bcb/
1919

2020
### 认识数据系统
2121

22-
单一工具难以满足复杂应用系统的需求,因此整体工作被拆解为一系列能被单个工具高效完成的任务,并通过**应用代码**将它们缝合起来。比如一个缓存、索引、数据库协作的例子: ![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630635449781-eccd8717-84aa-4d52-b8d7-98790e2c92c7.png) 一个应用被称为数据密集型的,如果数据是其主要挑战(数据量,数据复杂度、数据变化速度)——与之相对的是计算密集型,即处理器速度是其瓶颈。 软件系统中很重要的三个问题:
22+
单一工具难以满足复杂应用系统的需求,因此整体工作被拆解为一系列能被单个工具高效完成的任务,并通过**应用代码**将它们缝合起来。比如一个缓存、索引、数据库协作的例子:
23+
24+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/9edb215b8ac240b2900a1e9335726591.png)
25+
26+
一个应用被称为数据密集型的,如果数据是其主要挑战(数据量,数据复杂度、数据变化速度)——与之相对的是计算密集型,即处理器速度是其瓶颈。 软件系统中很重要的三个问题:
2327

2428
1. **可靠性**(Reliability):系统面临各种错误(硬件故障、软件故障、人为错误),仍可正常工作。
2529
2. **可扩展性**(Scalability):有合理的办法应对系统的增长(数据量、流量、复杂性)。
@@ -57,11 +61,11 @@ permalink: /pages/ea0d9bcb/
5761

5862
推文放在全局推文集合中,查询的时候做 join
5963

60-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630635645347-1e1e5660-4229-42a2-9bf9-da9850ff944b.png)
64+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/b25ff5f3743d48da8756dc47c1bee085.png)
6165

6266
推文插入到每个关注者的时间线中,「扇出」比较大,当有千万粉丝的大 V 发推压力大
6367

64-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630635669997-5d4951ae-5ec3-426d-9fc4-35a3cf579088.png)
68+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/a1de0d74041d4081a6d24a170b0b78d4.png)
6569

6670
推特从方案一变成了方案二,然后变成了两者结合的方式
6771

@@ -76,13 +80,13 @@ permalink: /pages/ea0d9bcb/
7680

7781
度量场景的响应时间,平均响应时间并不是一个合适的指标,因为它无法告诉有多少用户实际经历了多少延迟。最好使用百分位数,比如中位数(P50)、P95、P99、P999 等标识。
7882

79-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630635717226-c218a4b8-b6f9-4e35-8f10-549d65cf3e23.png)
83+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/f9af14b027ff40a393c809aff52ea058.png)
8084

8185
测量客户端的响应时间非常重要(而不是服务端),比如会出现头部阻塞、网络延迟等。
8286

8387
实践中的百分位点,可以用一个滑动的时间窗口(比如 10 分钟)进行统计。可以对列表进行排序,效率低的话,考虑一下正向衰减,t-digest 等近似计算方法。
8488

85-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630635787568-a7885c39-997f-4edb-8fb9-79eff18467a2.png)
89+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/3ad6e2f7b694496e8b17ae75eeabae56.png)
8690

8791
响应时间:中位数指标比平均响应时间更适合描述等待时间。
8892

@@ -133,7 +137,7 @@ Hibernate 这样的 **对象关系映射(ORM)** 框架则减少这个转换
133137

134138
对于一份简历而言,关系型模型描述一对多的关系需要多张表。
135139

136-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630640250504-01ef3f97-39be-4c23-9a9e-ce17c1cde6a9.png) 对于简历这样的数据结构,主要是一个自包含的文档,用 JSON 表示非常合适。JSON 相比于多表模式,有更好的局部性,可以一次查询出一个用户的所有信息。JSON 其实是树形层级结构。![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630640396753-c7fed755-b19b-4948-9c84-53d232548633.png)
140+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/c62d81a53f89470cbdeff7e9d505f7f6.png) 对于简历这样的数据结构,主要是一个自包含的文档,用 JSON 表示非常合适。JSON 相比于多表模式,有更好的局部性,可以一次查询出一个用户的所有信息。JSON 其实是树形层级结构。![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630640396753-c7fed755-b19b-4948-9c84-53d232548633.png)
137141

138142
#### 多对一和多对多的关系
139143

@@ -148,7 +152,7 @@ Hibernate 这样的 **对象关系映射(ORM)** 框架则减少这个转换
148152
- 组织和学校作为实体:组织、学校有各自的主页。
149153
- 推荐:用户可以推荐其他用户在自己的简历上。
150154

151-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630641413918-4cee1b5a-9bd2-4375-b86a-8d6d7183ee34.png)
155+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/f0bab1f5945649c0be7c5ce7baa50b7a.png)
152156

153157
#### 文档数据库是否在重演历史?
154158

@@ -159,7 +163,7 @@ Hibernate 这样的 **对象关系映射(ORM)** 框架则减少这个转换
159163
- **关系模型(relational model)** - 后来,演变成了 SQL,并被广泛接受
160164
- **网络模型(network model)** - 最初很受关注,但最终被淡忘
161165

162-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1630641447595-4315fa0f-8338-4596-88d1-e423e040ac62.png)
166+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/2a262accd01544749339c7aee91f106f.png)
163167

164168
##### 网络模型
165169

@@ -303,7 +307,7 @@ MapReduce 是一种编程模型,用于在许多机器上批量处理海量数
303307

304308
当旧版本的应用视图更新新版本的应用所写入的数据时,可能会丢失数据。
305309

306-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1633665482803-0f0f81b1-9abc-4171-b532-577637eecfe6.png)
310+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/62008278b03f4369ba37e58c0aab5493.png)
307311

308312
##### 归档数据
309313

docs/00.笔记/分布式/分布式理论/数据密集型应用系统设计笔记二.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ PostgreSQL 、Oracle 以及其他系统等支持这种复制方式。其主要
195195

196196
如果数据库总是以相同的顺序写入,则读取总是看到一致的序列,不会发生这种反常。然而,在许多分布式数据库中,不同的分区独立运行,因此不存在全局写入顺序。这就导致当用户从数据库中读数据时,可能会看到数据库的某部分旧值和另一部分新值。
197197

198-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1634010909693-6cc91fe9-aa0c-4e73-82c9-585646a15281.png)
198+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/73585721ffd942328eadced26a4ba07a.png)
199199

200200
一个解决方案是确保任何具有因果顺序关系的写入都交给一个分区来完成,但该方案效率很低。此外,还有一些算法来显示地跟踪事件因果关系(Happend Before)。
201201

@@ -223,7 +223,7 @@ PostgreSQL 、Oracle 以及其他系统等支持这种复制方式。其主要
223223

224224
在每个数据中心内,采用常规的主从复制;而在数据中心之间,由各数据中心的主节点来负责同其他数据中心的主节点进行数据的交换、更新。
225225

226-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1634094581707-9d2d4ff2-0d5d-43b2-8210-2cf7b2d16684.png)
226+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/f1048e86ecff4e4fb8f5b92ebad9f8d7.png)
227227

228228
主从复制和多主复制的差异:
229229

@@ -290,7 +290,7 @@ PostgreSQL 、Oracle 以及其他系统等支持这种复制方式。其主要
290290
- 只有两个领导者时,只有一个合理的拓扑:互相写入。
291291
- 当有两个以上的领导,拓扑很多样:
292292

293-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1634524795875-25e044c1-fc7d-47dc-a871-1af2fb3f5edd.png)
293+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/8877f8c1b03645adb310022e152d5918.png)
294294

295295
- 最普遍的是全部到全部;
296296
- MySQL 仅支持环形拓扑。
@@ -310,7 +310,7 @@ PostgreSQL 、Oracle 以及其他系统等支持这种复制方式。其主要
310310

311311
- 网络问题导致消息顺序错乱
312312

313-
![image.png](https://picture-bed-1251805293.file.myqcloud.com/1634525242078-5d57538c-fd13-4851-8962-c1934768e7fb.png)
313+
![image.png](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/cb72a5b29cf34aa19fc90eca7f491f4c.png)
314314

315315
- 写入时添加时间戳是不够的。
316316
- 解决办法是**版本向量技术**
@@ -537,4 +537,4 @@ ACID,分别代表原子性( Atomicity ), 一致性( Consistency ),
537537

538538
## 参考资料
539539

540-
- [**数据密集型应用系统设计**](https://book.douban.com/subject/30329536/) - 这可能是目前最好的分布式存储书籍,强力推荐【进阶】
540+
- [**数据密集型应用系统设计**](https://book.douban.com/subject/30329536/) - 这可能是目前最好的分布式存储书籍,强力推荐【进阶】

docs/00.笔记/分布式/分布式调度/深入理解Sentinel笔记.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ permalink: /pages/f7d4ff23/
3434

3535
当流量很大的情况下,某个依赖的阻塞,会导致上游服务请求被阻塞。当这种级联故障愈演愈烈,就可能造成整个线上服务不可用的雪崩效应,如下图。这种情况若持续恶化,如果上游服务本身还被其他服务所依赖,就可能出现多米洛骨牌效应,导致多个服务都无法正常工作。
3636

37-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081544885.png)
37+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/c29936811c8a475d8a5aab76c85f4d3c.png)
3838

3939
## 为什么需要服务降级以及常见的几种降级方式
4040

@@ -150,4 +150,4 @@ NodeSelectorSlot 负责为资源的首次访问创建 DefaultNode,以及维护
150150

151151
## 资料
152152

153-
https://wujiuye.com/album/52c96863a60441829497e98226e2c337
153+
https://wujiuye.com/album/52c96863a60441829497e98226e2c337

docs/00.笔记/设计/极客时间教程-微服务架构核心20讲笔记.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ DevOps 理念:谁开发的,谁构建,谁支持。
8686

8787
中台战略和微服务的关系
8888

89-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081717094.png)
89+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/d596eae6086a4406ac24d2ca7312efc2.png)
9090

9191
业务中台和技术中台统称为大中台,支撑业务前台。正所谓,万丈高楼平地起,中台基础越扎实,前台发展就越快。
9292

@@ -307,4 +307,4 @@ UAT 环境: User Acceptance Test (用户验收测试)
307307

308308
基于容器的云发布体系
309309

310-
![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220628071152.png)
310+
![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220628071152.png)

docs/01.Java/JavaCore/JVM/Java_虚拟机_垃圾收集.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -363,28 +363,28 @@ CMS 收集器运行步骤如下:
363363

364364
**(1)堆空间被分割为三块空间**
365365

366-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081724119.PNG)
366+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/c68f9afdd16544b381229b8e3cab978a.png)
367367

368368
年轻代分割成一个 Eden 区和两个 Survivor 区。年老代一个连续的空间。就地完成对象收集。除非有 FullGC 否则不会压缩。
369369

370370
**(2)CMS 年轻代垃圾收集如何工作**
371371

372372
年轻代被标为浅绿色,年老代被标记为蓝色。如果你的应用已经运行了一段时间,CMS 的堆看起来应该是这个样子。对象分散在年老代区域里。
373373

374-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081725568.PNG)
374+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/fda8eb230d544ddfa5d6d9101d7b604c.png)
375375

376376
使用 CMS,年老代对象就地释放。它们不会被来回移动。这个空间不会被压缩除非发生 FullGC。
377377

378378
**(3)年轻代收集**
379379

380380
从 Eden 和 Survivor 区复制活跃对象到另一个 Survivor 区。所有达到他们的年龄阈值的对象会晋升到年老代。
381381

382-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081725559.PNG)
382+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/b5a35acac1374de18eeb8e78d8d8c971.png)
383383
**(4)年轻代回收之后**
384384

385385
一次年轻代垃圾收集之后,Eden 区和其中一个 Survivor 区被清空。
386386

387-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081725941.PNG)
387+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/e93290ecb3e94e21a035f51fb38c685a.png)
388388
最近晋升的对象以深蓝色显示在上图中,绿色的对象是年轻代幸免的还没有晋升到老年代对象。
389389

390390
##### CMS 回收年老代详细步骤
@@ -393,7 +393,7 @@ CMS 收集器运行步骤如下:
393393

394394
发生两次 stop the world 事件:初始标记和重新标记。当年老代达到特定的占用比例时,CMS 开始执行。
395395

396-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081726287.PNG)
396+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/4acf6b83a417432db892cbc5a6267b96.png)
397397

398398
- 初始标记是一个短暂暂停的、可达对象被标记的阶段。
399399
- 并发标记寻找活跃对象在应用连续执行时。
@@ -403,15 +403,15 @@ CMS 收集器运行步骤如下:
403403

404404
在之前阶段没有被标记的对象会被就地释放。不进行压缩操作。
405405

406-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081726220.PNG)
406+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/da098e6570be494e953c450e6d931bd8.png)
407407

408408
**注意:**未被标记的对象等于死亡对象
409409

410410
**(3)年老代收集-清除之后**
411411

412412
清除阶段之后,你可以看到大量内存被释放。你还可以注意到没有进行压缩操作。
413413

414-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081726500.PNG)
414+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/2abd98df7b054b448b9d346467f4f6d0.png)
415415

416416
最后,CMS 收集器会再次进入重新设置阶段,等待下一次垃圾收集时机的到来。
417417

@@ -483,15 +483,15 @@ G1 取消了永久代,并把年轻代和老年代划分成多个大小相等
483483

484484
堆空间是一个被分成许多固定大小区域的内存块。
485485

486-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081730800.PNG)
486+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/7774f99b61d843939f285115f8ad7895.png)
487487

488488
Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000 个左右的大小相等、每个大小范围在 1 到 32M 的区域。
489489

490490
**(2)G1 堆空间分配**
491491

492492
实际上,这些区域被映射成 Eden、Survivor、年老代空间的逻辑表述形式。
493493

494-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081730251.PNG)
494+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/d8d3e1f31c334c1e8fba9f44f9f3c22a.png)
495495

496496
图片中的颜色表明了哪个区域被关联上什么角色。活跃对象从一个区域疏散(复制、移动)到另一个区域。区域被设计为并行的方式收集,可以暂停或者不暂停所有的其它用户线程。
497497

@@ -503,15 +503,15 @@ Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000
503503

504504
堆空间被分割成大约 2000 个区域。最小 1M,最大 32M,蓝色区域保持年老代对象,绿色区域保持年轻代对象。
505505

506-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081730610.PNG)
506+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/67e6a1a4dc8c4e569712934570d5c92d.png)
507507

508508
**注意:**区域没有必要像旧的收集器一样是保持连续的。
509509

510510
**(4)G1 的年轻代收集**
511511

512512
活跃对象会被疏散(复制、移动)到一个或多个 survivor 区域。如果达到晋升总阈值,对象会晋升到年老代区域。
513513

514-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081731624.PNG)
514+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/7fe0b0b51674407dafa82cd45c1d0ad3.png)
515515

516516
这是一个 stop the world 暂停。为下一次年轻代垃圾回收计算 Eden 和 Survivor 的大小。保留审计信息有助于计算大小。类似目标暂停时间的事情会被考虑在内。
517517

@@ -521,7 +521,7 @@ Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000
521521

522522
活跃对象被疏散到 Survivor 或者年老代区域。
523523

524-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081731782.PNG)
524+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/daf36ad8bd8b4e078610f3ef650ba8b7.png)
525525

526526
最近晋升的对象显示为深蓝色。Survivor 区域显示为绿色。
527527

@@ -539,31 +539,31 @@ Java 虚拟机启动时选定区域大小。Java 虚拟机通常会指定 2000
539539

540540
年轻代垃圾收集肩负着活跃对象初始标记的任务。在日志文件中被标为* GC pause (young)(inital-mark)*
541541

542-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081731007.PNG)
542+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/b69e620775e748de87b001209b2c89bf.png)
543543

544544
**(2)并发标记阶段**
545545

546546
如果发现空区域 (“X”标示的),在重新标记阶段它们会被马上清除掉。当然,决定活性的审计信息也在此时被计算。
547547

548-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081731904.PNG)
548+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/8711eeb3c8c343fbbb203ca67dfd5812.png)
549549

550550
**(3)重新标记阶段**
551551

552552
空的区域被清除和回收掉。所有区域的活性在此时计算。
553553

554-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081732338.PNG)
554+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/509fc4c28157403588b0819ef01222cc.png)
555555

556556
**(4)复制/清理阶段**
557557

558558
G1 选择活性最低的区域,这些区域能够以最快的速度回收。然后这些区域会在年轻代垃圾回收过程中被回收。在日志中被指示为* [GC pause (mixed)]*。所以年轻代和年老代在同一时间被回收。
559559

560-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081732946.PNG)
560+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/614edc61b0a54b758ea8d7632a76d1c4.png)
561561

562562
**(5)复制/清理阶段之后**
563563

564564
被选择的区域已经被回收和压缩到图中显示的深蓝色区和深绿色区中。
565565

566-
![](https://raw.githubusercontent.com/dunwu/images/master/202602081732852.PNG)
566+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/244ee999971f478fbc4b2eb8a514e4e6.png)
567567

568568
### 总结
569569

@@ -657,4 +657,4 @@ JVM 规范中运行时数据区域中的**方法区**,在 HotSpot 虚拟机中
657657
- [从表到里学习 JVM 实现](https://www.douban.com/doulist/2545443/)
658658
- [详解 JVM Garbage First(G1) 垃圾收集器](https://blog.csdn.net/coderlius/article/details/79272773)
659659
- [G1 垃圾收集器入门](https://blog.csdn.net/zhanggang807/article/details/45956325)
660-
- [Getting Started with the G1 Garbage Collector](https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html)
660+
- [Getting Started with the G1 Garbage Collector](https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html)

0 commit comments

Comments
 (0)