Skip to content

Commit 9e476c1

Browse files
committed
[docs update]typo
1 parent 91c491d commit 9e476c1

File tree

9 files changed

+59
-17
lines changed

9 files changed

+59
-17
lines changed

docs/cs-basics/network/application-layer-protocol.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP
7171
>
7272
> 这种将命令和数据分开传送的思想大大提高了 FTP 的效率。
7373
74-
![FTP工作过程](https://oss.javaguide.cn/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%80%BB%E7%BB%93/ftp.png)
74+
![FTP工作过程](https://oss.javaguide.cn/github/javaguide/cs-basics/network/ftp.png)
7575

7676

7777
## Telnet:远程登陆协议
@@ -84,4 +84,4 @@ FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP
8484

8585
**Telnet 和 SSH 之间的主要区别在于 SSH 协议会对传输的数据进行加密保证数据安全性。**
8686

87-
![TCP和UDP](https://oss.javaguide.cn/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%80%BB%E7%BB%93/TCP%E5%92%8CUDP.png)
87+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/tcp-udp-overview.png)

docs/cs-basics/network/http-status-codes.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ tag:
77

88
HTTP 状态码用于描述 HTTP 请求的结果,比如2xx 就代表请求被成功处理。
99

10-
![状态码](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/%E7%8A%B6%E6%80%81%E7%A0%81.png)
10+
![常见 HTTP 状态码](https://oss.javaguide.cn/github/javaguide/cs-basics/network/http-status-code.png)
1111

1212
### 1xx Informational(信息性状态码)
1313

docs/cs-basics/network/osi&tcp-ip-model.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ OSI 七层模型虽然失败了,但是却提供了很多不错的理论基础
5151

5252
**应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。** 我们把应用层交互的数据单元称为报文。
5353

54-
![](https://oss.javaguide.cn/github/javaguide/5971-2-7I1-20220111095024771-20220111201807861.png)
54+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/network-five-layer-sample-diagram.png)
5555

5656
应用层协议定义了网络通信规则,对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如支持 Web 应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。
5757

docs/cs-basics/network/other-network-questions.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ tag:
130130

131131
HTTP 状态码用于描述 HTTP 请求的结果,比如2xx 就代表请求被成功处理。
132132

133-
![HTTP 状态码](https://oss.javaguide.cn/github/javaguide/%E7%8A%B6%E6%80%81%E7%A0%81.png)
133+
![常见 HTTP 状态码](https://oss.javaguide.cn/github/javaguide/cs-basics/network/http-status-code.png)
134134

135135
关于 HTTP 状态码更详细的总结,可以看我写的这篇文章:[HTTP 常见状态码总结(应用层)](./http-status-codes.md)
136136

@@ -162,8 +162,6 @@ HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说
162162

163163
最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
164164

165-
![HTTP是无状态协议](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/HTTP是无状态的.png)
166-
167165
### URI 和 URL 的区别是什么?
168166

169167
* URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。

docs/database/redis/redis-questions-01.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -489,8 +489,10 @@ save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生
489489

490490
Redis 提供了两个命令来生成 RDB 快照文件:
491491

492-
- `save` : 主线程执行,会阻塞主线程;
493-
- `bgsave` : 子线程执行,不会阻塞主线程,默认选项。
492+
- `save` : 同步保存操作,会阻塞 Redis 主线程;
493+
- `bgsave` : fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项。
494+
495+
> 这里说 Redis 主线程而不是主进程的主要是因为 Redis 启动之后主要是通过单线程的方式完成主要的工作。如果你想将其描述为 Redis 主进程,也没毛病。
494496
495497
### 什么是 AOF 持久化?
496498

docs/distributed-system/api-gateway.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ icon: "gateway"
3636
- **响应聚合**:某些情况下用户请求要获取的响应内容可能会来自于多个业务服务。网关作为业务服务的调用方,可以把多个服务的响应整合起来,再一并返回给用户。
3737
- **灰度发布** :将请求动态分流到不同的服务版本(最基本的一种灰度发布)。
3838
- **异常处理**:对于业务服务返回的异常响应,可以在网关层在返回给用户之前做转换处理。这样可以把一些业务侧返回的异常细节隐藏,转换成用户友好的错误提示返回。
39-
- **API 文档:**如果计划将 API 暴露给组织以外的开发人员,那么必须考虑使用 API 文档,例如 Swagger 或 OpenAPI。
39+
- **API 文档:** 如果计划将 API 暴露给组织以外的开发人员,那么必须考虑使用 API 文档,例如 Swagger 或 OpenAPI。
4040
- **协议转换** :通过协议转换整合后台基于 REST、AMQP、Dubbo 等不同风格和实现技术的微服务,面向 Web Mobile、开放平台等特定客户端提供统一服务。
4141

4242
下图来源于[百亿规模 API 网关服务 Shepherd 的设计与实现 - 美团技术团队 - 2021](https://mp.weixin.qq.com/s/iITqdIiHi3XGKq6u6FRVdg)这篇文章。

docs/java/concurrent/java-concurrent-questions-03.md

+15-1
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,21 @@ public ScheduledThreadPoolExecutor(int corePoolSize) {
324324
- **`ThreadPoolExecutor.DiscardPolicy`** 不处理新任务,直接丢弃掉。
325325
- **`ThreadPoolExecutor.DiscardOldestPolicy`** 此策略将丢弃最早的未处理的任务请求。
326326

327-
举个例子: Spring 通过 `ThreadPoolTaskExecutor` 或者我们直接通过 `ThreadPoolExecutor` 的构造函数创建线程池的时候,当我们不指定 `RejectedExecutionHandler` 饱和策略的话来配置线程池的时候默认使用的是 `ThreadPoolExecutor.AbortPolicy`。在默认情况下,`ThreadPoolExecutor` 将抛出 `RejectedExecutionException` 来拒绝新来的任务 ,这代表你将丢失对这个任务的处理。 对于可伸缩的应用程序,建议使用 `ThreadPoolExecutor.CallerRunsPolicy`。当最大池被填满时,此策略为我们提供可伸缩队列。(这个直接查看 `ThreadPoolExecutor` 的构造函数源码就可以看出,比较简单的原因,这里就不贴代码了)
327+
举个例子:Spring 通过 `ThreadPoolTaskExecutor` 或者我们直接通过 `ThreadPoolExecutor` 的构造函数创建线程池的时候,当我们不指定 `RejectedExecutionHandler` 饱和策略来配置线程池的时候,默认使用的是 `AbortPolicy`。在这种饱和策略下,如果队列满了,`ThreadPoolExecutor` 将抛出 `RejectedExecutionException` 异常来拒绝新来的任务 ,这代表你将丢失对这个任务的处理。如果不想丢弃任务的话,可以使用`CallerRunsPolicy``CallerRunsPolicy` 和其他的几个策略不同,它既不会抛弃任务,也不会抛出异常,而是将任务回退给调用者,使用调用者的线程来执行任务
328+
329+
```java
330+
public static class CallerRunsPolicy implements RejectedExecutionHandler {
331+
332+
public CallerRunsPolicy() { }
333+
334+
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
335+
if (!e.isShutdown()) {
336+
// 直接主线程执行,而不是线程池中的线程执行
337+
r.run();
338+
}
339+
}
340+
}
341+
```
328342

329343
### 线程池常用的阻塞队列有哪些?
330344

docs/java/jvm/jvm-parameters-intro.md

+33-5
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,38 @@ JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参
9595
下面是一些常用参数:
9696

9797
```bash
98-
-XX:MetaspaceSize=N #设置 Metaspace 的初始(和最小大小
99-
-XX:MaxMetaspaceSize=N #设置 Metaspace 的最大大小,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。
98+
-XX:MetaspaceSize=N #设置 Metaspace 的初始大小(是一个常见的误区,后面会解释
99+
-XX:MaxMetaspaceSize=N #设置 Metaspace 的最大大小
100100
```
101101

102+
**🐛 修正(参见: [issue#1947](https://github.com/Snailclimb/JavaGuide/issues/1947)**
103+
104+
1、Metaspace 的初始容量并不是 `-XX:MetaspaceSize` 设置,无论 `-XX:MetaspaceSize` 配置什么值,对于 64 位 JVM 来说,Metaspace 的初始容量都是 21807104(约 20.8m)。
105+
106+
可以参考 Oracle 官方文档 [Other Considerations](https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html) 中提到的:
107+
108+
> Specify a higher value for the option MetaspaceSize to avoid early garbage collections induced for class metadata. The amount of class metadata allocated for an application is application-dependent and general guidelines do not exist for the selection of MetaspaceSize. The default size of MetaspaceSize is platform-dependent and ranges from 12 MB to about 20 MB.
109+
>
110+
> MetaspaceSize 的默认大小取决于平台,范围从 12 MB 到大约 20 MB。
111+
112+
另外,还可以看一下这个试验:[JVM 参数 MetaspaceSize 的误解](https://mp.weixin.qq.com/s/jqfppqqd98DfAJHZhFbmxA)
113+
114+
2、Metaspace 由于使用不断扩容到`-XX:MetaspaceSize`参数指定的量,就会发生 FGC,且之后每次 Metaspace 扩容都会发生 Full GC。
115+
116+
也就是说,MetaspaceSize 表示 Metaspace 使用过程中触发 Full GC 的阈值,只对触发起作用。
117+
118+
垃圾搜集器内部是根据变量 `_capacity_until_GC`来判断 Metaspace 区域是否达到阈值的,初始化代码如下所示:
119+
120+
```c
121+
void MetaspaceGC::initialize() {
122+
// Set the high-water mark to MaxMetapaceSize during VM initializaton since
123+
// we can't do a GC during initialization.
124+
_capacity_until_GC = MaxMetaspaceSize;
125+
}
126+
```
127+
128+
相关阅读: [issue 更正:MaxMetaspaceSize如果不指定大小的话,不会耗尽内存 #1204 ](https://github.com/Snailclimb/JavaGuide/issues/1204)
129+
102130
## 3.垃圾收集相关
103131

104132
### 3.1.垃圾回收器
@@ -194,11 +222,11 @@ JVM 具有四种类型的 GC 实现:
194222

195223
这里推荐了非常多优质的 JVM 实践相关的文章,推荐阅读,尤其是 JVM 性能优化和问题排查相关的文章。
196224

197-
- [JVM参数配置说明 - 阿里云官方文档 - 2022](https://help.aliyun.com/document_detail/148851.html)
198-
- [JVM内存配置最佳实践 - 阿里云官方文档 - 2022](https://help.aliyun.com/document_detail/383255.html)
225+
- [JVM 参数配置说明 - 阿里云官方文档 - 2022](https://help.aliyun.com/document_detail/148851.html)
226+
- [JVM 内存配置最佳实践 - 阿里云官方文档 - 2022](https://help.aliyun.com/document_detail/383255.html)
199227
- [求你了,GC 日志打印别再瞎配置了 - 思否 - 2022](https://segmentfault.com/a/1190000039806436)
200228
- [一次大量 JVM Native 内存泄露的排查分析(64M 问题) - 掘金 - 2022](https://juejin.cn/post/7078624931826794503)
201-
- [一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程 - HeadpDump - 2021](https://heapdump.cn/article/1859160)
229+
- [一次线上 JVM 调优实践,FullGC40 次/天到 10 天一次的优化过程 - HeadpDump - 2021](https://heapdump.cn/article/1859160)
202230
- [听说 JVM 性能优化很难?今天我小试了一把! - 陈树义 - 2021](https://shuyi.tech/archives/have-a-try-in-jvm-combat)
203231
- [你们要的线上 GC 问题案例来啦 - 编了个程 - 2021](https://mp.weixin.qq.com/s/df1uxHWUXzhErxW1sZ6OvQ)
204232
- [Java 中 9 种常见的 CMS GC 问题分析与解决 - 美团技术团队 - 2020](https://tech.meituan.com/2020/11/12/java-9-cms-gc.html)

docs/system-design/framework/spring/spring-design-patterns-summary.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ Spring 中 `JdbcTemplate`、`HibernateTemplate` 等以 Template 结尾的对数
187187

188188
## 观察者模式
189189

190-
观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用,在很多场景都可以解耦我们的代码。比如我们每次添加商品的时候都需要重新更新商品索引,这个时候就可以利用观察者模式来解决这个问题。
190+
观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,依赖这个对象的所有对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用,在很多场景都可以解耦我们的代码。比如我们每次添加商品的时候都需要重新更新商品索引,这个时候就可以利用观察者模式来解决这个问题。
191191

192192
### Spring 事件驱动模型中的三种角色
193193

0 commit comments

Comments
 (0)