From 72c9808bdf58139a33e821e38b545b70b890bfa8 Mon Sep 17 00:00:00 2001 From: Xiang Jaywhen Date: Sat, 20 Mar 2021 21:04:43 +0800 Subject: [PATCH 01/11] =?UTF-8?q?Java=E8=AF=AD=E5=8F=A5=E7=BC=BA=E5=B0=91?= =?UTF-8?q?=E5=88=86=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit System.out.println(list) 后缺少分号 --- .../Java\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index cdc3a3dafe6..f6d6f08e664 100644 --- "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -272,7 +272,7 @@ Method add = clazz.getDeclaredMethod("add", Object.class); //但是通过反射添加,是可以的 add.invoke(list, "kl"); -System.out.println(list) +System.out.println(list); ``` 泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。 From 6aa948f08b5bc86e5a3621344c593a5b6d0b3999 Mon Sep 17 00:00:00 2001 From: Spike Date: Mon, 22 Mar 2021 15:54:00 +0800 Subject: [PATCH 02/11] Paxos Time wrong change 1900 to 1990 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c9355cb2c07..162c9f71cbd 100644 --- a/README.md +++ b/README.md @@ -291,7 +291,7 @@ CAP 也就是 Consistency(一致性)、Availability(可用性)、Partiti #### Paxos 算法和 Raft 算法 -**Paxos 算法**诞生于 1900 年,这是一种解决分布式系统一致性的经典算法 。但是,由于 Paxos 算法非常难以理解和实现,不断有人尝试简化这一算法。到了2013 年才诞生了一个比 Paxos 算法更易理解和实现的分布式一致性算法—**Raft 算法**。 +**Paxos 算法**诞生于 1990 年,这是一种解决分布式系统一致性的经典算法 。但是,由于 Paxos 算法非常难以理解和实现,不断有人尝试简化这一算法。到了2013 年才诞生了一个比 Paxos 算法更易理解和实现的分布式一致性算法—**Raft 算法**。 #### 搜索引擎 From 7f6a1032deb8decb5fe6e13ab468fade436cd9e4 Mon Sep 17 00:00:00 2001 From: guide Date: Mon, 22 Mar 2021 23:11:17 +0800 Subject: [PATCH 03/11] =?UTF-8?q?Update=20SpringBoot+Spring=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E6=B3=A8=E8=A7=A3=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" "b/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" index 0cdfb26073f..e60eeef25e6 100644 --- "a/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" +++ "b/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" @@ -409,7 +409,7 @@ class WebSite { SpringBoot 项目的 spring-boot-starter-web 依赖中已经有 hibernate-validator 包,不需要引用相关依赖。如下图所示(通过 idea 插件—Maven Helper 生成): -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-08/c7bacd12-1c1a-4e41-aaaf-4cad840fc073.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/c7bacd12-1c1a-4e41-aaaf-4cad840fc073.png) 非 SpringBoot 项目需要自行引入相关依赖包,这里不多做讲解,具体可以查看我的这篇文章:《[如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485783&idx=1&sn=a407f3b75efa17c643407daa7fb2acd6&chksm=cea2469cf9d5cf8afbcd0a8a1c9cc4294d6805b8e01bee6f76bb2884c5bc15478e91459def49&token=292197051&lang=zh_CN#rd)》。 From dd69265cd6142039abba2bf69c0e9d0d51065cd2 Mon Sep 17 00:00:00 2001 From: guide Date: Mon, 22 Mar 2021 23:11:20 +0800 Subject: [PATCH 04/11] =?UTF-8?q?Update=20=E8=BD=AF=E4=BB=B6=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E7=AF=87.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\266\350\264\250\351\207\217\347\257\207.md" | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git "a/docs/books/\350\275\257\344\273\266\350\264\250\351\207\217\347\257\207.md" "b/docs/books/\350\275\257\344\273\266\350\264\250\351\207\217\347\257\207.md" index 239385bb800..c063d8288ca 100644 --- "a/docs/books/\350\275\257\344\273\266\350\264\250\351\207\217\347\257\207.md" +++ "b/docs/books/\350\275\257\344\273\266\350\264\250\351\207\217\347\257\207.md" @@ -78,7 +78,7 @@ Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓 ### 《Effective java 》 -![Effective Java中文版(第3版)](file:///Users/guide/Documents/GitHub/JavaGuide/docs/books/images/s32282160.png?lastModify=1615696092) +![Effective Java中文版(第3版)](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/s32282160.png) **Java程序员必看!** @@ -86,7 +86,7 @@ Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓 ### 《人月神话》 -![img](file:///Users/guide/Documents/GitHub/JavaGuide/docs/books/images/8ece325c-4491-4ffd-9d3d-77e95159ec40.png?lastModify=1615696092) +![img](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/8ece325c-4491-4ffd-9d3d-77e95159ec40.png) 这本书主要描述了软件开发的基本定律:**一个需要10天才能干完的活,不可能让10个人在1天干完!** @@ -96,17 +96,16 @@ Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓 ### 《领域驱动设计:软件核心复杂性应对之道》 -![img](file:///Users/guide/Documents/GitHub/JavaGuide/docs/books/images/7e80418d-20b1-4066-b9af-cfe434b1bf1a.png?lastModify=1615696092) +![img](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/7e80418d-20b1-4066-b9af-cfe434b1bf1a.png) 这本领域驱动设计方面的经典之作一直被各种推荐,但是我还来及读。 ### 其他 -- 《深入浅出设计模式》 -- [《代码的未来》](https://book.douban.com/subject/24536403/) :作者是Ruby之父松本行弘。 -- 《系统架构》 -- 《软件架构设计:大型网站技术架构与业务架构融合之道》 : -- 《微服务架构设计模式》 :这本书是世界十大软件架构师之一、微服务架构先驱Chris Richardson亲笔撰写,豆瓣评分9.6。示例代码使用Java语言和Spring框架。帮助你设计、实现、测试和部署基于微服务的应用程序。 +- [《代码的未来》](https://book.douban.com/subject/24536403/) :这本书的作者是Ruby之父松本行弘,算是一本年代比较久远的书籍(13年出版),不过,还是非常值得一读。这本书的内容主要介绍是编程/编程语言的本质。我个人还是比较喜欢松本行弘的文字风格,并且,你看他的文章也确实能够有所收获。 +- [《深入浅出设计模式》](https://book.douban.com/subject/1488876/) : 比较有趣的风格,适合设计模式入门。 +- [《软件架构设计:大型网站技术架构与业务架构融合之道》](https://book.douban.com/subject/30443578/) : 内容非常全面。适合面试前突击一些比较重要的理论知识,也适合拿来扩充/完善自己的技术广度。 +- [《微服务架构设计模式》](https://book.douban.com/subject/33425123/) :这本书是世界十大软件架构师之一、微服务架构先驱Chris Richardson亲笔撰写,豆瓣评分9.6。示例代码使用Java语言和Spring框架。帮助你设计、实现、测试和部署基于微服务的应用程序。 最后再推荐两个相关的文档: From b8cb76b549ba728598ee6d2f9e347b9d53e07a3d Mon Sep 17 00:00:00 2001 From: guide Date: Mon, 22 Mar 2021 23:11:24 +0800 Subject: [PATCH 05/11] =?UTF-8?q?Create=20=E8=AE=A1=E7=AE=97=E6=9C=BA?= =?UTF-8?q?=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\234\272\345\237\272\347\241\200.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 "docs/books/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200.md" diff --git "a/docs/books/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200.md" "b/docs/books/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200.md" new file mode 100644 index 00000000000..572f6c2aa33 --- /dev/null +++ "b/docs/books/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200.md" @@ -0,0 +1,71 @@ +这部分内容我不光会推荐书籍,还会顺便推荐一些我觉得不错的教学视频&Project。 + + + +## 算法 + + + +## 操作系统 + +如果你要系统地学习操作系统的话,最硬核最权威的书籍是 **《操作系统导论》** 。你可以再配套一个 **《深入理解计算机系统》** 加深你对计算机系统本质的认识,美滋滋! + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10-12/image-20201012191645919.png) + +如果你比较喜欢动手,对于理论知识比较抵触的话,我推荐你看看《30 天自制操作系统》,这本书会手把手教你编写一个操作系统。 + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10-12/s11138117.jpg) + +再推荐一个我的朋友总结的图解操作系统 PDF![点击此链接即可获取。](https://www.yuque.com/docs/share/61b99973-ecb3-4317-ba19-fc1a15dd842c?#) + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-04-1/image-20201204142453079.png) + +如果你比较喜欢看视频的话,我建议你可以看看北京交通大学的慕课[《操作系统》](https://www.icourse163.org/course/NJTU-1003245001)。 + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-04-1/image-20201204131429567.png) + +这个视频课程基本把操作系统的体系结构、设计机理及实现方法和技术相关重要的知识点介绍的差不多了。 + +还有下面这个国外的课程 [《深入理解计算机系统 》](https://www.bilibili.com/video/av31289365?from=search&seid=16298868573410423104) 也很不错。 + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-04-1/image-20201204140653318.png) + +## 计算机网络 + +关于这门课,首先强烈推荐参考书是**机械工业出版社的《计算机网络——自顶向下方法》**。该书目录清晰,按照 TCP/IP 五层模型逐层讲解,对每层涉及的技术都展开了详细讨论,基本上高校里开设的课程的教学大纲就是这本书的目录了。 + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C.jpg) + +如果你觉得上面这本书看着比较枯燥的话,我强烈推荐+安利你看看下面这两本非常有趣的网络相关的书籍: + +- [《图解 HTTP》](https://book.douban.com/subject/25863515/ "《图解 HTTP》") : 讲漫画一样的讲 HTTP,很有意思,不会觉得枯燥,大概也涵盖也 HTTP 常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究 HTTP 相关知识的话,读这本书的话应该来说就差不多了。 +- [《网络是怎样连接的》](https://book.douban.com/subject/26941639/ "《网络是怎样连接的》") :从在浏览器中输入网址开始,一路追踪了到显示出网页内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了实际的网络设备和软件是如何工作的。 + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10/image-20201011215144139.png) + +除了理论知识之外,学习计算机网络非常重要的一点就是:“**动手实践**”。这点和我们编程差不多。 + +Github 上就有一些名校的计算机网络试验/Project: + +- [哈工大计算机网络实验](https://github.com/rccoder/HIT-Computer-Network) +- [《计算机网络-自顶向下方法(原书第6版)》编程作业,Wireshark实验文档的翻译和解答。](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES) +- [计算机网络的期末Project,用Python编写的聊天室](https://github.com/KevinWang15/network-pj-chatroom) +- [CMU的计算机网络课程](https://computer-networks.github.io/sp19/lectures.html) + +我知道,还有很多小伙伴可能比较喜欢边看视频边学习。所以,我这里再推荐几个顶好的计算机网络视频讲解。 + +**1.[哈工大的计算机网络课程](http://www.icourse163.org/course/HIT-154005)** :国家精品课程,截止目前已经开了10次课了。大家对这门课的评价都非常高!所以,非常推荐大家看一下! + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-15-1/image-20201218141241911.png) + +**2.[王道考研的计算机网络](https://www.bilibili.com/video/BV19E411D78Q?from=search&seid=17198507506906312317)** :非常适合CS专业考研的小朋友!这个视频目前在哔哩哔哩上已经有1.6w+的点赞。 + +![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-18-1/image-20201218141652837.png) + +除了上面推荐的书籍和视频之外,再推荐两篇计算机网络总结的文章: + +- [计算机网络常见面试题](https://snailclimb.gitee.io/javaguide/#/docs/network/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C) +- [计算机网络基础知识总结](https://snailclimb.gitee.io/javaguide/#/docs/network/计算机网络知识总结) + +最后再补充一个:[浙江大学的计算机网络课程资料、教材和试卷](https://github.com/QSCTech/zju-icicles/tree/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80) 。需要的小伙伴请查收! + From 05aabacb4c3e167e98fe642aa94342f2cb8baf06 Mon Sep 17 00:00:00 2001 From: guide Date: Mon, 22 Mar 2021 23:11:27 +0800 Subject: [PATCH 06/11] =?UTF-8?q?Update=20=E6=B1=82=E8=81=8C=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E7=AF=87.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1\202\350\201\214\351\235\242\350\257\225\347\257\207.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/docs/books/\346\261\202\350\201\214\351\235\242\350\257\225\347\257\207.md" "b/docs/books/\346\261\202\350\201\214\351\235\242\350\257\225\347\257\207.md" index 7dbebf4dbf0..0148fd04938 100644 --- "a/docs/books/\346\261\202\350\201\214\351\235\242\350\257\225\347\257\207.md" +++ "b/docs/books/\346\261\202\350\201\214\351\235\242\350\257\225\347\257\207.md" @@ -4,4 +4,7 @@ [《程序员面试逻辑题解析》](https://book.douban.com/subject/20452340/) -[《剑指Offer:名企面试官精讲典型编程题(第2版)》](https://book.douban.com/subject/27008702/) \ No newline at end of file +[《剑指Offer:名企面试官精讲典型编程题(第2版)》](https://book.douban.com/subject/27008702/) + +**[《Offer来了:Java面试核心知识点精讲》](https://book.douban.com/subject/34872163/)** : 这本书基本概括了Java程序员面试必备知识点,可以拿来准备Java面试或者夯实基础。不过,我还是更推荐我的 [JavaGuide](https://github.com/Snailclimb/JavaGuide) 和 **[《JavaGuide面试突击版》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486324&idx=1&sn=e8b690ddaedabc486bd399310105aad3&chksm=cea244bff9d5cda9a627fa65235be09e7b089e92cf49c0eb0ceb35b39bbed86c1fab0125f5af&token=1745528586&lang=zh_CN&scene=21#wechat_redirect)** ,两者配合起来学习,真香! + From f2e211268543a5e4d5b25f914daf866dd741b9ff Mon Sep 17 00:00:00 2001 From: guide Date: Mon, 22 Mar 2021 23:11:38 +0800 Subject: [PATCH 07/11] Update MySQL.md --- docs/database/MySQL.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index c51ad4e0116..edefdbfbaa1 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -8,8 +8,6 @@ 由于 MySQL 是开源免费并且比较成熟的数据库,因此,MySQL 被大量使用在各种系统中。任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是**3306**。 - - ### 存储引擎 #### 一些常用命令 From ccdea6cf595a194386e609a73e71d0f26463ff58 Mon Sep 17 00:00:00 2001 From: guide Date: Mon, 22 Mar 2021 23:25:39 +0800 Subject: [PATCH 08/11] =?UTF-8?q?[fix]=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\235\242\350\257\225\351\242\230\346\200\273\347\273\223.md" | 2 +- docs/system-design/framework/mybatis/mybatis-interview.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/system-design/distributed-system/message-queue/Kafka\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\346\200\273\347\273\223.md" "b/docs/system-design/distributed-system/message-queue/Kafka\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\346\200\273\347\273\223.md" index 42ef9746dc6..d62c19ec167 100644 --- "a/docs/system-design/distributed-system/message-queue/Kafka\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\346\200\273\347\273\223.md" +++ "b/docs/system-design/distributed-system/message-queue/Kafka\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230\346\200\273\347\273\223.md" @@ -170,7 +170,7 @@ if (sendResult.getRecordMetadata() != null) { 当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。 -**解决办法也比较粗暴,我们手动关闭闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset 。** 但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如你刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费两次。 +**解决办法也比较粗暴,我们手动关闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset 。** 但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如你刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费两次。 #### Kafka 弄丢了消息 diff --git a/docs/system-design/framework/mybatis/mybatis-interview.md b/docs/system-design/framework/mybatis/mybatis-interview.md index a1d91e55e00..01023d3cc55 100644 --- a/docs/system-design/framework/mybatis/mybatis-interview.md +++ b/docs/system-design/framework/mybatis/mybatis-interview.md @@ -17,7 +17,7 @@ MyBatis 技术内幕系列博客,从原理和源码角度,介绍了其内部 - `${}`是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如\${driver}会被静态替换为`com.mysql.jdbc.Driver`。 - `#{}`是 sql 的参数占位符,MyBatis 会将 sql 中的`#{}`替换为?号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的?号占位符设置参数值,比如 ps.setInt(0, parameterValue),`#{item.name}` 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 `param.getItem().getName()`。 -#### 2、Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签? +#### 2、Xml 映射文件中,除了常见的 select|insert|update|delete 标签之外,还有哪些标签? 注:这道题是京东面试官面试我时问的。 From da93026fa32c185f04f1cfc250cdb6e664e75d65 Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 24 Mar 2021 16:00:07 +0800 Subject: [PATCH 09/11] =?UTF-8?q?Update=20=E7=B1=BB=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E8=BF=87=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整符号和标点 --- ...345\212\240\350\275\275\350\277\207\347\250\213.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md" "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md" index d2dacdb1d90..cd04e42af54 100644 --- "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md" +++ "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md" @@ -23,7 +23,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢? -系统加载 Class 类型的文件主要三步:**加载->连接->初始化**。连接过程又可分为三步:**验证->准备->解析**。 +系统加载 Class 类型的文件主要三步:**加载->连接->初始化**。连接过程又可分为三步:**验证->准备->解析**。 ![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/类加载过程.png) @@ -33,7 +33,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚 1. 通过全类名获取定义此类的二进制字节流 2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 -3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口 +3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口 虚拟机规范上面这3点并不具体,因此是非常灵活的。比如:"通过全类名获取定义此类的二进制字节流" 并没有指明具体从哪里获取、怎样获取。比如:比较常见的就是从 ZIP 包中读取(日后出现的JAR、EAR、WAR格式的基础)、其他文件生成(典型应用就是JSP)等等。 @@ -70,7 +70,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚 初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法 ` ()`方法的过程。 -对于`()` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 `()` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。 +对于` ()` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 ` ()` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。 对于初始化阶段,虚拟机严格规范了有且只有5种情况下,必须对类进行初始化(只有主动去使用类才会初始化类): @@ -79,7 +79,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚 - 当jvm执行getstatic指令时会初始化类。即程序访问类的静态变量(不是静态常量,常量会被加载到运行时常量池)。 - 当jvm执行putstatic指令时会初始化类。即程序给类的静态变量赋值。 - 当jvm执行invokestatic指令时会初始化类。即程序调用类的静态方法。 -2. 使用 `java.lang.reflect` 包的方法对类进行反射调用时如Class.forname("..."),newInstance()等等。 ,如果类没初始化,需要触发其初始化。 +2. 使用 `java.lang.reflect` 包的方法对类进行反射调用时如Class.forname("..."), newInstance()等等。如果类没初始化,需要触发其初始化。 3. 初始化一个类,如果其父类还未初始化,则先触发该父类的初始化。 4. 当虚拟机启动时,用户需要定义一个要执行的主类 (包含 main 方法的那个类),虚拟机会先初始化这个类。 5. MethodHandle和VarHandle可以看作是轻量级的反射调用机制,而要想使用这2个调用, @@ -100,7 +100,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚 所以,在JVM生命周期类,由jvm自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。 -只要想通一点就好了,jdk自带的BootstrapClassLoader,ExtClassLoader,AppClassLoader负责加载jdk提供的类,所以它们(类加载器的实例)肯定不会被回收。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。 +只要想通一点就好了,jdk自带的BootstrapClassLoader, ExtClassLoader, AppClassLoader负责加载jdk提供的类,所以它们(类加载器的实例)肯定不会被回收。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。 **参考** From c887e03bcb7f489e79da7b30bd8249c00c0e2bc7 Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 24 Mar 2021 16:16:06 +0800 Subject: [PATCH 10/11] =?UTF-8?q?Update=20=E7=B1=BB=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=99=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\261\273\345\212\240\350\275\275\345\231\250.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" index 37394a92444..9b6f46ac0e3 100644 --- "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" +++ "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" @@ -16,7 +16,7 @@ ## 回顾一下类加载过程 -类加载过程:**加载->连接->初始化**。连接过程又可分为三步:**验证->准备->解析**。 +类加载过程:**加载->连接->初始化**。连接过程又可分为三步:**验证->准备->解析**。 ![类加载过程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/类加载过程.png) @@ -30,7 +30,7 @@ JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他 1. **BootstrapClassLoader(启动类加载器)** :最顶层的加载类,由C++实现,负责加载 `%JAVA_HOME%/lib`目录下的jar包和类或者或被 `-Xbootclasspath`参数指定的路径中的所有类。 2. **ExtensionClassLoader(扩展类加载器)** :主要负责加载目录 `%JRE_HOME%/lib/ext` 目录下的jar包和类,或被 `java.ext.dirs` 系统变量所指定的路径下的jar包。 -3. **AppClassLoader(应用程序类加载器)** :面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。 +3. **AppClassLoader(应用程序类加载器)** :面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。 ## 双亲委派模型 @@ -60,7 +60,7 @@ The Parent of ClassLodarDemo's ClassLoader is sun.misc.Launcher$ExtClassLoader@1 The GrandParent of ClassLodarDemo's ClassLoader is null ``` -`AppClassLoader`的父类加载器为`ExtClassLoader` +`AppClassLoader`的父类加载器为`ExtClassLoader`, `ExtClassLoader`的父类加载器为null,**null并不代表`ExtClassLoader`没有父类加载器,而是 `BootstrapClassLoader`** 。 其实这个双亲翻译的容易让别人误解,我们一般理解的双亲都是父母,这里的双亲更多地表达的是“父母这一辈”的人而已,并不是说真的有一个 Mother ClassLoader 和一个 Father ClassLoader 。另外,类加载器之间的“父子”关系也不是通过继承来体现的,是由“优先级”来决定。官方API文档对这部分的描述如下: From af8fe02d3d5ce2be8333ad30d70b31c5acdbecfa Mon Sep 17 00:00:00 2001 From: Spike Date: Wed, 24 Mar 2021 22:53:24 +0800 Subject: [PATCH 11/11] Update basis-of-authority-certification.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wrong redirection with “, ” --- .../authority-certification/basis-of-authority-certification.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 12a0fd91a47..22055861772 100644 --- a/docs/system-design/authority-certification/basis-of-authority-certification.md +++ b/docs/system-design/authority-certification/basis-of-authority-certification.md @@ -37,7 +37,7 @@ Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但 ### 2.2 如何在服务端使用 Cookie 呢? -这部分内容参考:https://attacomsian.com/blog/cookies-spring-boot, 更多如何在Spring Boot中使用Cookie 的内容可以查看这篇文章。 +这部分内容参考:https://attacomsian.com/blog/cookies-spring-boot, 更多如何在Spring Boot中使用Cookie 的内容可以查看这篇文章。 **1)设置cookie返回给客户端**