+
**[我的第一本算法书](https://book.douban.com/subject/30357170/) (豆瓣评分 7.1,0.2K+人评价)**
一本不那么“专业”的算法书籍。和下面两本推荐的算法书籍都是比较通俗易懂,“不那么深入”的算法书籍。我个人非常推荐,配图和讲解都非常不错!
-
+
**[《算法图解》](https://book.douban.com/subject/26979890/)(豆瓣评分 8.4,1.5K+人评价)**
@@ -32,7 +32,7 @@
### 经典
-
+
**[《算法 第四版》](https://book.douban.com/subject/10432347/)(豆瓣评分 9.3,0.4K+人评价)**
@@ -42,7 +42,7 @@
> **下面这些书籍都是经典中的经典,但是阅读起来难度也比较大,不做太多阐述,神书就完事了!推荐先看 《算法》,然后再选下面的书籍进行进一步阅读。不需要都看,找一本好好看或者找某本书的某一个章节知识点好好看。**
-
+
**[编程珠玑](https://book.douban.com/subject/3227098/)(豆瓣评分 9.1,2K+人评价)**
@@ -50,15 +50,13 @@
很多人都说这本书不是教你具体的算法,而是教你一种编程的思考方式。这种思考方式不仅仅在编程领域适用,在其他同样适用。
-
-
-
+
**[《算法设计手册》](https://book.douban.com/subject/4048566/)(豆瓣评分9.1 , 45人评价)**
被 [Teach Yourself Computer Science](https://teachyourselfcs.com/) 强烈推荐的一本算法书籍。
-
+
**[《算法导论》](https://book.douban.com/subject/20432061/) (豆瓣评分 9.2,0.4K+人评价)**
@@ -80,15 +78,13 @@
-
+
**[程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)](https://book.douban.com/subject/30422021/) (豆瓣评分 8.7,0.2K+人评价)**
题目相比于《剑指 offer》 来说要难很多,题目涵盖面相比于《剑指 offer》也更加全面。全书一共有将近300道真实出现过的经典代码面试题。
-
-
-
+
diff --git a/docs/java/jvm/JVM垃圾回收.md b/docs/java/jvm/JVM垃圾回收.md
index 5f001636..f6ede785 100644
--- a/docs/java/jvm/JVM垃圾回收.md
+++ b/docs/java/jvm/JVM垃圾回收.md
@@ -332,7 +332,7 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引
为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
-
+
### 3.3 标记-整理算法
diff --git a/docs/java/multi-thread/images/java线程池学习总结/CachedThreadPool-execute.png b/docs/java/multi-thread/images/java线程池学习总结/CachedThreadPool-execute.png
new file mode 100644
index 00000000..8b2ede8a
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/CachedThreadPool-execute.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/Executors工具类.png b/docs/java/multi-thread/images/java线程池学习总结/Executors工具类.png
new file mode 100644
index 00000000..87658aa3
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/Executors工具类.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/Executor框架的使用示意图.png b/docs/java/multi-thread/images/java线程池学习总结/Executor框架的使用示意图.png
new file mode 100644
index 00000000..5cc148dd
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/Executor框架的使用示意图.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/FixedThreadPool.png b/docs/java/multi-thread/images/java线程池学习总结/FixedThreadPool.png
new file mode 100644
index 00000000..fc1c7034
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/FixedThreadPool.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/ScheduledThreadPoolExecutor执行周期任务步骤.png b/docs/java/multi-thread/images/java线程池学习总结/ScheduledThreadPoolExecutor执行周期任务步骤.png
new file mode 100644
index 00000000..c56521d2
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/ScheduledThreadPoolExecutor执行周期任务步骤.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/ScheduledThreadPoolExecutor机制.png b/docs/java/multi-thread/images/java线程池学习总结/ScheduledThreadPoolExecutor机制.png
new file mode 100644
index 00000000..bae0dc5b
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/ScheduledThreadPoolExecutor机制.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/SingleThreadExecutor.png b/docs/java/multi-thread/images/java线程池学习总结/SingleThreadExecutor.png
new file mode 100644
index 00000000..c933674f
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/SingleThreadExecutor.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/threadpoolexecutor构造函数.png b/docs/java/multi-thread/images/java线程池学习总结/threadpoolexecutor构造函数.png
new file mode 100644
index 00000000..30c29859
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/threadpoolexecutor构造函数.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/任务的执行相关接口.png b/docs/java/multi-thread/images/java线程池学习总结/任务的执行相关接口.png
new file mode 100644
index 00000000..6aebd60b
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/任务的执行相关接口.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/图解线程池实现原理.png b/docs/java/multi-thread/images/java线程池学习总结/图解线程池实现原理.png
new file mode 100644
index 00000000..bc661944
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/图解线程池实现原理.png differ
diff --git a/docs/java/multi-thread/images/java线程池学习总结/线程池各个参数之间的关系.png b/docs/java/multi-thread/images/java线程池学习总结/线程池各个参数之间的关系.png
new file mode 100644
index 00000000..d609943b
Binary files /dev/null and b/docs/java/multi-thread/images/java线程池学习总结/线程池各个参数之间的关系.png differ
diff --git a/docs/java/multi-thread/java线程池学习总结.md b/docs/java/multi-thread/java线程池学习总结.md
index 54f4b650..6a946dd0 100644
--- a/docs/java/multi-thread/java线程池学习总结.md
+++ b/docs/java/multi-thread/java线程池学习总结.md
@@ -97,7 +97,7 @@ public class ScheduledThreadPoolExecutor
implements ScheduledExecutorService
```
-
+
#### 3) 异步计算的结果(`Future`)
@@ -107,7 +107,7 @@ public class ScheduledThreadPoolExecutor
### 2.3 Executor 框架的使用示意图
-
+
1. **主线程首先要创建实现 `Runnable` 或者 `Callable` 接口的任务对象。**
2. **把创建完成的实现 `Runnable`/`Callable`接口的 对象直接交给 `ExecutorService` 执行**: `ExecutorService.execute(Runnable command)`)或者也可以把 `Runnable` 对象或`Callable` 对象提交给 `ExecutorService` 执行(`ExecutorService.submit(Runnable task)`或 `ExecutorService.submit(Callable
-
-
-
-### CPU
-
-针对应用程序,我们通常关注的是内核CPU调度器功能和性能。
-
-线程的状态分析主要是分析线程的时间用在什么地方,而线程状态的分类一般分为:
-
-a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys。
- b. off-CPU:等待下一轮上CPU,或者等待I/O、锁、换页等等,其状态可以细分为可执行、匿名换页、睡 眠、锁、空闲等状态。
-
-#### **分析工具**
-
-| 工具 | 描述 |
-| -------- | ------------------------------ |
-| uptime/w | 查看服务器运行时间、平均负载 |
-| top | 监控每个进程的CPU用量分解 |
-| vmstat | 系统的CPU平均负载情况 |
-| mpstat | 查看多核CPU信息 |
-| sar -u | 查看CPU过去或未来时点CPU利用率 |
-| pidstat | 查看每个进程的用量分解 |
-
-#### uptime
-
-uptime 命令可以用来查看服务器已经运行了多久,当前登录的用户有多少,以及服务器在过去的1分钟、5分钟、15分钟的系统平均负载值
-
-
-
-第一项是当前时间,up 表示系统正在运行,6:47是系统启动的总时间,最后是系统的负载load信息
-
-w 同上,增加了具体登陆了那些用户及登陆时间。
-
-#### top
-
-常用来监控[Linux](http://lib.csdn.net/base/linux)的系统状况,比如cpu、内存的使用,显示系统上正在运行的进程。
-
-
-
-1. **系统运行时间和平均负载:**
-
- top命令的顶部显示与uptime命令相似的输出。
-
- 这些字段显示:
-
- - 当前时间
- - 系统已运行的时间
- - 当前登录用户的数量
- - 相应最近5、10和15分钟内的平均负载。
-
-2. **任务**
-
- 第二行显示的是任务或者进程的总结。进程可以处于不同的状态。这里显示了全部进程的数量。除此之外,还有正在运行、睡眠、停止、僵尸进程的数量(僵尸是一种进程的状态)。这些进程概括信息可以用’t’切换显示。
-
-3. **CPU状态**
-
- 下一行显示的是CPU状态。 这里显示了不同模式下的所占CPU时间的百分比。这些不同的CPU时间表示:
-
- - us, user: 运行(未调整优先级的) 用户进程的CPU时间
- - sy,system: 运行内核进程的CPU时间
- - ni,niced:运行已调整优先级的用户进程的CPU时间
- - wa,IO wait: 用于等待IO完成的CPU时间
- - hi:处理硬件中断的CPU时间
- - si: 处理软件中断的CPU时间
- - st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。
-
-4. **内存使用**
-
- 接下来两行显示内存使用率,有点像’free’命令。第一行是物理内存使用,第二行是虚拟内存使用(交换空间)。
-
- 物理内存显示如下:全部可用内存、已使用内存、空闲内存、缓冲内存。相似地:交换部分显示的是:全部、已使用、空闲和缓冲交换空间。
-
- > 这里要说明的是不能用windows的内存概念理解这些数据,如果按windows的方式此台服务器“危矣”:8G的内存总量只剩下530M的可用内存。Linux的内存管理有其特殊性,复杂点需要一本书来说明,这里只是简单说点和我们传统概念(windows)的不同。
- >
- > 第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在[linux](http://lib.csdn.net/base/linux)上free内存会越来越少,但不用为此担心。
- >
- > 如果出于习惯去计算可用内存数,这里有个近似的计算公式:
- >
- > **第四行的free + 第四行的buffers + 第五行的cached。**
- >
- > 对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
-
-5. **字段/列**
-
- | 进程的属性 | 属性含义 |
- | ---------- | ------------------------------------------------------------ |
- | PID | 进程ID,进程的唯一标识符 |
- | USER | 进程所有者的实际用户名。 |
- | PR | 进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。 |
- | NI | 进程的nice值(优先级)。越小的值意味着越高的优先级。 |
- | VIRT | 进程使用的虚拟内存。 |
- | RES | 驻留内存大小。驻留内存是任务使用的非交换物理内存大小。 |
- | SHR | SHR是进程使用的共享内存。 |
- | S | 这个是进程的状态。它有以下不同的值:
-
-每个参数的含义:
-
-**Procs(进程)**
-
-| r: | 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1) |
-| ---- | ------------------------------------------------------------ |
-| b | 等待IO的进程数量。 |
-
-**Memory(内存)**
-
-| swpd | 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。 |
-| ----- | ------------------------------------------------------------ |
-| free | 空闲物理内存大小。 |
-| buff | 用作缓冲的内存大小。 |
-| cache | 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。 |
-
-**Swap**
-
-| si | 每秒从交换区写到内存的大小,由磁盘调入内存。 |
-| ---- | -------------------------------------------- |
-| so | 每秒写入交换区的内存大小,由内存调入磁盘。 |
-
-注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。因为linux总是先把内存用光.
-
-**IO**
-
-| bi | 每秒读取的块数 |
-| ---- | -------------- |
-| bo | 每秒写入的块数 |
-
-注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
-
-**system(系统)**
-
-| in | 每秒中断数,包括时钟中断。 |
-| ---- | -------------------------- |
-| cs | 每秒上下文切换数。 |
-
-注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
-
-**CPU(以百分比表示)**
-
-| us | 用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。 |
-| ---- | ------------------------------------------------------------ |
-| sy: | 内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。 |
-| wa | IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。 |
-| id | 空闲时间百分比 |
-
-#### mpstat
-
- mpstat是一个实时监控工具,主要报告与CPU相关统计信息,在多核心cpu系统中,不仅可以查看cpu平均信息,还可以查看指定cpu信息。
-
-> mpstat -P ALL //查看全部CPU的负载情况。
->
-> mpstat 2 5 //可指定间隔时间和次数。
-
-| CPU: 处理器编号。关键字all表示统计信息计算为所有处理器之间的平均值。 |
-| ------------------------------------------------------------ |
-| %usr: 显示在用户级(应用程序)执行时发生的CPU利用率百分比。 |
-| %nice: 显示以优先级较高的用户级别执行时发生的CPU利用率百分比。 |
-| %sys: 显示在系统级(内核)执行时发生的CPU利用率百分比。请注意,这不包括维护硬件和软件的时间中断。 |
-| %iowait: 显示系统具有未完成磁盘I / O请求的CPU或CPU空闲的时间百分比。 |
-| %irq: 显示CPU或CPU用于服务硬件中断的时间百分比。 |
-| %soft: 显示CPU或CPU用于服务软件中断的时间百分比。 |
-| %steal: 显示虚拟CPU或CPU在管理程序为另一个虚拟处理器提供服务时非自愿等待的时间百分比。 |
-| %guest: 显示CPU或CPU运行虚拟处理器所花费的时间百分比。 |
-
-#### sar
-
-系统活动情况报告,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等
-
-CPU相关:
-
-sar -p (查看全天)
-
-sar -u 1 10 (1:每隔一秒,10:写入10次)
-
-CPU输出项-详细说明
-
-CPU:all 表示统计信息为所有 CPU 的平均值。
-
-%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
-
-%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
-
-%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
-
-%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
-
-%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
-
-%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
-
-#### pidstat
-
-用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。
-
-pidstat 和 pidstat -u -p ALL 是等效的。
- pidstat 默认显示了所有进程的cpu使用率。
-
-详细说明
-
-PID:进程ID
-
-%usr:进程在用户空间占用cpu的百分比
-
-%system:进程在内核空间占用cpu的百分比
-
-%guest:进程在虚拟机占用cpu的百分比
-
-%CPU:进程占用cpu的百分比
-
-CPU:处理进程的cpu编号
-
-Command:当前进程对应的命令
-
-### 内存
-
-内存是为提高效率而生,实际分析问题的时候,内存出现问题可能不只是影响性能,而是影响服务或者引起其他问题。同样对于内存有些概念需要清楚:
-
-- 主存
-- 虚拟内存
-- 常驻内存
-- 地址空间
-- OOM
-- 页缓存
-- 缺页
-- 换页
-- 交换空间
-- 交换
-- 用户分配器libc、glibc、libmalloc和mtmalloc
-- LINUX内核级SLUB分配器
-
-#### 分析工具
-
-| 工具 | 描述 |
-| ------- | ------------------------------ |
-| free | 查看内存的使用情况 |
-| top | 监控每个进程的内存使用情况 |
-| vmstat | 虚拟内存统计信息 |
-| sar -r | 查看内存 |
-| sar | 查看CPU过去或未来时点CPU利用率 |
-| pidstat | 查看每个进程的内存使用情况 |
-
-#### free
-
-free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。
-
-Mem 行(第二行)是内存的使用情况。
- Swap 行(第三行)是交换空间的使用情况。
- total 列显示系统总的可用物理内存和交换空间大小。
- used 列显示已经被使用的物理内存和交换空间。
- free 列显示还有多少物理内存和交换空间可用使用。
- shared 列显示被共享使用的物理内存大小。
- buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
- available 列显示还可以被应用程序使用的物理内存大小。
-
-常用命令:
-
-> free
->
-> free -g 以GB显示
->
-> free -m 以MB显示
->
-> free -h 自动转换展示
->
-> free -h -s 3 有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数
-
-所以从应用程序的角度来说,**available = free + buffer + cache**
-
-可用内存=系统free memory+buffers+cached。
-
-#### top
-
-请参考上面top的详解
-
-#### vmstat
-
-请参考上面vmstat的详解
-
-#### sar
-
-sar -r #查看内存使用情况
-
-详解:
-
-kbmemfree 空闲的物理内存大小
-
-kbmemused 使用中的物理内存大小
-
-%memused 物理内存使用率
-
-kbbuffers 内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer 和cache.
-
-kbcached 缓存的文件大小
-
-kbcommit 保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存 +Swap分区)
-
-commt 这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值
-
-#### pidstat
-
-pidstat -r 查看内存使用情况 pidstat将显示各活动进程的内存使用统计
-
-PID:进程标识符
-
-Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
-
-Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
-
-VSZ:虚拟地址大小,虚拟内存的使用KB
-
-RSS:常驻集合大小,非交换区五里内存使用KB
-
-Command:task命令名
-
-### 磁盘IO
-
-磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。
-
-在理解磁盘IO之前,同样我们需要理解一些概念,例如:
-
-- 文件系统
-- VFS
-- 文件系统缓存
-- 页缓存page cache
-- 缓冲区高速缓存buffer cache
-- 目录缓存
-- inode
-- inode缓存
-- noop调用策略
-
-#### 分析工具
-
-| 工具 | 描述 |
-| ------- | ---------------------------- |
-| iostat | 磁盘详细统计信息 |
-| iotop | 按进程查看磁盘IO统计信息 |
-| pidstat | 查看每个进程的磁盘IO使用情况 |
-
-#### iostat
-
-iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况
-
-
-
-CPU属性
-
-%user:CPU处在用户模式下的时间百分比。
-
-%nice:CPU处在带NICE值的用户模式下的时间百分比。
-
-%system:CPU处在系统模式下的时间百分比。
-
-%iowait:CPU等待输入输出完成时间的百分比。
-
-%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
-
-%idle:CPU空闲时间百分比。
-
-备注:
-
-如果%iowait的值过高,表示硬盘存在I/O瓶颈
-
-如果%idle值高,表示CPU较空闲
-
-如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
-
-如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。
-
-Device属性
-
-tps:该设备每秒的传输次数
-
-kB_read/s:每秒从设备(drive expressed)读取的数据量;
-
-kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
-
-kB_read: 读取的总数据量;
-
-kB_wrtn:写入的总数量数据量
-
-常用命令:
-
-iostat 2 3 每隔2秒刷新显示,且显示3次
-
-iostat -m 以M为单位显示所有信息
-
-查看设备使用率(%util)、响应时间(await)
-
-iostat -d -x -k 1 1
-
-#### iotop
-
-在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到IO负载的来源进程和来源文件导致无法进行相应的策略来解决问题。
-
-如果你想检查那个进程实际在做 I/O,那么运行 `iotop` 命令加上 `-o` 或者 `--only` 参数。
-
-iotop --only
-
-#### pidstat
-
-显示各个进程的IO使用情况
-
-pidstat -d
-
-报告IO统计显示以下信息:
-
-- PID:进程id
-- kB_rd/s:每秒从磁盘读取的KB
-- kB_wr/s:每秒写入磁盘KB
-- kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
-- COMMAND:task的命令名
-
-### 网络
-
-#### 分析工具
-
-| ping | 测试网络的连通性 |
-| -------- | ---------------------------- |
-| netstat | 检验本机各端口的网络连接情况 |
-| hostname | 查看主机和域名 |
-
-#### ping
-
-常用命令参数:
-
--d 使用Socket的SO_DEBUG功能。
-
--f 极限检测。大量且快速地送网络封包给一台机器,看它的回应。
-
--n 只输出数值。
-
--q 不显示任何传送封包的信息,只显示最后的结果。
-
--r 忽略普通的Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题。
-
--R 记录路由过程。
-
--v 详细显示指令的执行过程。
-
--c 数目:在发送指定数目的包后停止。
-
--i 秒数:设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。
-
--I 网络界面:使用指定的网络界面送出数据包。
-
--l 前置载入:设置在送出要求信息之前,先行发出的数据包。
-
--p 范本样式:设置填满数据包的范本样式。
-
--s 字节数:指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。
-
--t 存活数值:设置存活数值TTL的大小。
-
-> ping -b 192.168.120.1 --ping网关
->
-> ping -c 10 192.168.120.206 --ping指定次数
->
-> ping -c 10 -i 0.5 192.168.120.206 --时间间隔和次数限制的ping
-
-#### netstat
-
-netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。
-
-netstat [选项]
-
-```
--a或--all:显示所有连线中的Socket;
--a (all) 显示所有选项,默认不显示LISTEN相关。
--t (tcp) 仅显示tcp相关选项。
--u (udp) 仅显示udp相关选项。
--n 拒绝显示别名,能显示数字的全部转化成数字。
--l 仅列出有在 Listen (监听) 的服务状态。
--p 显示建立相关链接的程序名
--r 显示路由信息,路由表
--e 显示扩展信息,例如uid等
--s 按各个协议进行统计
--c 每隔一个固定时间,执行该netstat命令。
-```
-
-常用命令:
-
-列出所有端口情况
-
-```
-netstat -a # 列出所有端口
-netstat -at # 列出所有TCP端口
-netstat -au # 列出所有UDP端口
-```
-
-列出所有处于监听状态的 Sockets
-
-```
-netstat -l # 只显示监听端口
-netstat -lt # 显示监听TCP端口
-netstat -lu # 显示监听UDP端口
-netstat -lx # 显示监听UNIX端口
-```
-
-显示每个协议的统计信息
-
-```
-netstat -s # 显示所有端口的统计信息
-netstat -st # 显示所有TCP的统计信息
-netstat -su # 显示所有UDP的统计信息
-```
-
-显示 PID 和进程名称
-
-```
-netstat -p
-```
-
-显示网络统计信息
-
-```
-netstat -s
-```
-
-统计机器中网络连接各个状态个数
-
-```
-netstat` `-an | ``awk` `'/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]} '
-```
-
-**补充netstat网络状态详解:**
-
-一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手
-
-
-
-
-
-**TCP的连接释放**
-
-
-
-```
-LISTEN:侦听来自远方的TCP端口的连接请求
-SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
-SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态估计被flood攻击了)
-ESTABLISHED:代表一个打开的连接
-FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
-FIN-WAIT-2:从远程TCP等待连接中断请求
-CLOSE-WAIT:等待从本地用户发来的连接中断请求
-CLOSING:等待远程TCP对连接中断的确认
-LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
-TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
-CLOSED:没有任何连接状态
-```
-
-------
-
-本文参考的文章: https://rdc.hundsun.com/portal/article/731.html?ref=myread
-
-
-
diff --git a/docs/system-design/authority-certification/basis-of-authority-certification.md b/docs/system-design/authority-certification/basis-of-authority-certification.md
index 86352a50..b576a28c 100644
--- a/docs/system-design/authority-certification/basis-of-authority-certification.md
+++ b/docs/system-design/authority-certification/basis-of-authority-certification.md
@@ -105,7 +105,7 @@ public String readAllCookies(HttpServletRequest request) {
花了个图简单总结了一下Session认证涉及的一些东西。
-
+
另外,Spring Session提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章:
@@ -192,7 +192,7 @@ OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了
微信支付账户相关参数:
-
+
**推荐阅读:**
diff --git a/docs/system-design/authority-certification/images/basis-of-authority-certification/session-cookie-intro.jpeg b/docs/system-design/authority-certification/images/basis-of-authority-certification/session-cookie-intro.jpeg
new file mode 100644
index 00000000..feca0114
Binary files /dev/null and b/docs/system-design/authority-certification/images/basis-of-authority-certification/session-cookie-intro.jpeg differ
diff --git a/docs/system-design/authority-certification/images/basis-of-authority-certification/session-cookie-intro.png b/docs/system-design/authority-certification/images/basis-of-authority-certification/session-cookie-intro.png
deleted file mode 100644
index b4ef47ac..00000000
Binary files a/docs/system-design/authority-certification/images/basis-of-authority-certification/session-cookie-intro.png and /dev/null differ
diff --git a/docs/system-design/framework/spring/Spring-Design-Patterns.md b/docs/system-design/framework/spring/Spring-Design-Patterns.md
index b37e318b..c5d56ff6 100644
--- a/docs/system-design/framework/spring/Spring-Design-Patterns.md
+++ b/docs/system-design/framework/spring/Spring-Design-Patterns.md
@@ -154,8 +154,6 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无
模板方法模式是一种行为设计模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的实现方式。
-
-
```java
public abstract class Template {
//这是我们的模板方法
diff --git a/docs/system-design/framework/spring/images/spring-transaction/ed279f05-f5ad-443e-84e9-513a9e777139.png b/docs/system-design/framework/spring/images/spring-transaction/ed279f05-f5ad-443e-84e9-513a9e777139.png
deleted file mode 100644
index d868e051..00000000
Binary files a/docs/system-design/framework/spring/images/spring-transaction/ed279f05-f5ad-443e-84e9-513a9e777139.png and /dev/null differ
diff --git a/docs/system-design/framework/spring/images/spring-transaction/接口使用原因.png b/docs/system-design/framework/spring/images/spring-transaction/接口使用原因.png
new file mode 100644
index 00000000..eb7e6748
Binary files /dev/null and b/docs/system-design/framework/spring/images/spring-transaction/接口使用原因.png differ
diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md
index f465cd0c..1e82a2aa 100644
--- a/docs/system-design/framework/spring/spring-transaction.md
+++ b/docs/system-design/framework/spring/spring-transaction.md
@@ -179,7 +179,7 @@ public interface PlatformTransactionManager {
主要是因为要将事务管理行为抽象出来,然后不同的平台去实现它,这样我们可以保证提供给外部的行为不变,方便我们扩展。我前段时间分享过:**“为什么我们要用接口?”**
-
+
#### 3.2.2. TransactionDefinition:事务属性
diff --git a/docs/system-design/high-availability/CAP理论.md b/docs/system-design/high-availability/CAP理论.md
index 381cda57..8be67af1 100644
--- a/docs/system-design/high-availability/CAP理论.md
+++ b/docs/system-design/high-availability/CAP理论.md
@@ -38,7 +38,7 @@ CAP 仅适用于原子读写的 NOSQL 场景中,并不适合数据库系统。
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
-
+
常见的可以作为注册中心的组件有:ZooKeeper、Eureka、Nacos...。
diff --git a/docs/system-design/high-availability/images/cap/cap.png b/docs/system-design/high-availability/images/cap/cap.png
index 4ac6504d..64ffddca 100644
Binary files a/docs/system-design/high-availability/images/cap/cap.png and b/docs/system-design/high-availability/images/cap/cap.png differ
diff --git a/docs/system-design/high-availability/images/cap/dubbo-architecture.png b/docs/system-design/high-availability/images/cap/dubbo-architecture.png
index 530fd53f..e00cd474 100644
Binary files a/docs/system-design/high-availability/images/cap/dubbo-architecture.png and b/docs/system-design/high-availability/images/cap/dubbo-architecture.png differ
diff --git a/index.html b/index.html
index 33be25a4..6b0768a5 100644
--- a/index.html
+++ b/index.html
@@ -8,11 +8,16 @@
-
+
+