Skip to content

Commit 578115c

Browse files
committed
fix:一些小错误修正
1 parent 877a637 commit 578115c

File tree

6 files changed

+26
-25
lines changed

6 files changed

+26
-25
lines changed

docs/books/java.md

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,6 @@ Java 8 算是一个里程碑式的版本,现在一般企业还是用 Java 8
110110

111111
另外,R 大在豆瓣发的[《从表到里学习 JVM 实现》](https://www.douban.com/doulist/2545443/)这篇文章中也推荐了很多不错的 JVM 相关的书籍,推荐小伙伴们去看看。
112112

113-
再推荐两个视频给喜欢看视频学习的小伙伴。
114-
115-
第 1 个是尚硅谷的宋红康老师讲的[《JVM 全套教程》](https://www.bilibili.com/video/BV1PJ411n7xZ)。这个课程的内容非常硬,一共有接近 400 小节。
116-
117-
课程的内容分为 3 部分:
118-
119-
1. 《内存与垃圾回收篇》
120-
2. 《字节码与类的加载篇》
121-
3. 《性能监控与调优篇》
122-
123-
第 2 个是你假笨大佬的 **[《JVM 参数【Memory 篇】》](https://club.perfma.com/course/438755/list)** 教程,很厉害了!
124-
125-
![](https://oss.javaguide.cn/java-guide-blog/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70.png)
126-
127113
## 常用工具
128114

129115
非常重要!非常重要!特别是 Git 和 Docker。

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ TIMESTAMP 只需要使用 4 个字节的存储空间,但是 DATETIME 需要耗
185185

186186
### Boolean 类型如何表示?
187187

188-
MySQL 中没有专门的布尔类型,而是用 TINYINT(1) 类型来表示布尔值。TINYINT(1) 类型可以存储 0 或 1,分别对应 false 或 true。
188+
MySQL 中没有专门的布尔类型,而是用 `TINYINT(1)` 类型来表示布尔值。`TINYINT(1)` 类型可以存储 0 或 1,分别对应 false 或 true。
189189

190190
### 手机号存储用 INT 还是 VARCHAR?
191191

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -577,8 +577,6 @@ Redis 通过 **IO 多路复用程序** 来监听来自客户端的大量连接
577577

578578
![文件事件处理器(file event handler)](https://oss.javaguide.cn/github/javaguide/database/redis/redis-event-handler.png)
579579

580-
相关阅读:[Redis 事件机制详解](http://remcarpediem.net/article/1aa2da89/)
581-
582580
### Redis6.0 之前为什么不使用多线程?
583581

584582
虽然说 Redis 是单线程模型,但实际上,**Redis 在 4.0 之后的版本中就已经加入了对多线程的支持。**

docs/high-performance/deep-pagination-optimization.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ SELECT * FROM t_order WHERE id > 100000 LIMIT 10
6363
> ![](https://oss.javaguide.cn/github/javaguide/mysql/alibaba-java-development-handbook-paging.png)
6464
6565
```sql
66-
# 通过子查询来获取 id 的起始值,把 limit 1000000 的条件转移到子查询
67-
SELECT * FROM t_order WHERE id >= (SELECT id FROM t_order where id > 1000000 limit 1) LIMIT 10;
66+
-- 先通过子查询在主键索引上进行偏移,快速找到起始ID
67+
SELECT * FROM t_order WHERE id >= (SELECT id FROM t_order LIMIT 1000000, 1) LIMIT 10;
6868
```
6969

7070
**工作原理**:
@@ -84,7 +84,10 @@ SELECT * FROM t_order WHERE id >= (SELECT id FROM t_order where id > 1000000 lim
8484
-- 使用 INNER JOIN 进行延迟关联
8585
SELECT t1.*
8686
FROM t_order t1
87-
INNER JOIN (SELECT id FROM t_order where id > 1000000 LIMIT 10) t2 ON t1.id = t2.id;
87+
INNER JOIN (
88+
-- 这里的子查询可以利用覆盖索引,性能极高
89+
SELECT id FROM t_order LIMIT 1000000, 10
90+
) t2 ON t1.id = t2.id;
8891
```
8992

9093
**工作原理**:

docs/interview-preparation/teach-you-how-to-prepare-for-the-interview-hand-in-hand.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ icon: path
88
本文节选自 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)**。这是一份教你如何更高效地准备面试的专栏,内容和 JavaGuide 互补,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ……)、优质面经等内容。
99
:::
1010

11-
你的身边一定有很多编程比你厉害但是找的工作并没有你好的朋友!**技术面试不同于编程,编程厉害不代表技术面试就一定能过。**
11+
你身边是否有这样的朋友:编程能力比你强,求职结果却不如你?其实**技术好≠面试能过** —— 如今的面试早已不是 “会写代码就行”,不做准备就去面,大概率是 “撞枪口”。
1212

13-
现在你去面个试,不认真准备一下,那简直就是往枪口上撞。我们大部分都只是普通人,没有发过顶级周刊或者获得过顶级大赛奖项。在这样一个技术面试氛围下,我们需要花费很多精力来准备面试,来提高自己的技术能力。“[面试造火箭,工作拧螺丝钉](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247491596&idx=1&sn=36fbf80922f71c200990de11514955f7&chksm=cea1afc7f9d626d1c70d5e54505495ac499ce6eb5e05ba4f4bb079a8563a84e27f17ceff38af&token=353590436&lang=zh_CN&scene=21#wechat_redirect)” 就是目前的一个常态,预计未来很长很长一段时间也还是会是这样。
13+
我们大多是普通开发者,没有顶会论文或竞赛大奖加持,面对 “面试造火箭,工作拧螺丝钉” 的常态,只能靠扎实准备突围。但准备面试不等于耍小聪明或者死记硬背面试题。 **一定不要对面试抱有侥幸心理。打铁还需自身硬!** 千万不要觉得自己看几篇面经,看几篇面试题解析就能通过面试了。一定要静下心来深入学习!
1414

15-
准备面试不等于耍小聪明或者死记硬背面试题。 **一定不要对面试抱有侥幸心理。打铁还需自身硬!** 千万不要觉得自己看几篇面经,看几篇面试题解析就能通过面试了。一定要静下心来深入学习!
16-
17-
这篇我会从宏观面出发简单聊聊如何准备 Java 面试,让你少走弯路!
15+
这篇文章就从宏观视角,带你搞懂程序员该如何系统准备面试:从求职导向学习,到简历优化、面试冲刺,帮你少走弯路,高效拿下心仪 offer。
1816

1917
## 尽早以求职为导向来学习
2018

docs/java/jvm/classloader.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,22 @@ Tomcat 这四个自定义的类加载器对应的目录如下:
361361

362362
比如,SPI 中,SPI 的接口(如 `java.sql.Driver`)是由 Java 核心库提供的,由`BootstrapClassLoader` 加载。而 SPI 的实现(如`com.mysql.cj.jdbc.Driver`)是由第三方供应商提供的,它们是由应用程序类加载器或者自定义类加载器来加载的。默认情况下,一个类及其依赖类由同一个类加载器加载。所以,加载 SPI 的接口的类加载器(`BootstrapClassLoader`)也会用来加载 SPI 的实现。按照双亲委派模型,`BootstrapClassLoader` 是无法找到 SPI 的实现类的,因为它无法委托给子类加载器去尝试加载。
363363

364+
这里需要注意:JDK 9+ 之后引入模块化,JDBC API 被拆分到 `java.sql` 模块中,不再是 `BootstrapClassLoader` 直接加载,而是由 `PlatformClassLoader` 加载。
365+
366+
```java
367+
public class ClassLoaderTest {
368+
public static void main(String[] args) throws ClassNotFoundException {
369+
Class<?> clazz = Class.forName("java.sql.Driver");
370+
ClassLoader loader = clazz.getClassLoader();
371+
System.out.println("Loader for java.sql.Driver: " + loader);
372+
373+
// .jdks/corretto-1.8.0_442/bin/java 环境下为 Loader for java.sql.Driver: null
374+
375+
// .jdks/jbr-17.0.12/bin/java 环境下为 Loader for java.sql.Driver: jdk.internal.loader.ClassLoaders$PlatformClassLoader@30f39991
376+
}
377+
}
378+
```
379+
364380
再比如,假设我们的项目中有 Spring 的 jar 包,由于其是 Web 应用之间共享的,因此会由 `SharedClassLoader` 加载(Web 服务器是 Tomcat)。我们项目中有一些用到了 Spring 的业务类,比如实现了 Spring 提供的接口、用到了 Spring 提供的注解。所以,加载 Spring 的类加载器(也就是 `SharedClassLoader`)也会用来加载这些业务类。但是业务类在 Web 应用目录下,不在 `SharedClassLoader` 的加载路径下,所以 `SharedClassLoader` 无法找到业务类,也就无法加载它们。
365381

366382
如何解决这个问题呢? 这个时候就需要用到 **线程上下文类加载器(`ThreadContextClassLoader`** 了。

0 commit comments

Comments
 (0)