mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-08-01 16:28:03 +08:00
Compare commits
1 Commits
61a6e46582
...
ec0e0aaea8
Author | SHA1 | Date | |
---|---|---|---|
|
ec0e0aaea8 |
@ -48,14 +48,14 @@ export default hopeTheme({
|
||||
notice: [
|
||||
{
|
||||
path: "/",
|
||||
title: "2023技术年货汇总",
|
||||
title: "Java学习路线最新版",
|
||||
showOnce: true,
|
||||
content:
|
||||
"抽空整理了一些优秀的技术团队公众号 2023 年的优质技术文章汇总,质量都挺高的,强烈建议打开这篇文章看看。",
|
||||
"花了一个月零碎的时间,我根据当下 Java 后端求职和招聘的最新要求,对之前写的 Java 后端学习路线进行了全面的优化和改进。这可能是你所见过的最用心、最全面的 Java 后端学习路线,共 4w+ 字。",
|
||||
actions: [
|
||||
{
|
||||
text: "开始阅读",
|
||||
link: "https://www.yuque.com/snailclimb/dr6cvl/nt5qc467p3t6s13k?singleDoc# 《2023技术年货》",
|
||||
text: "免费获取",
|
||||
link: "https://mp.weixin.qq.com/s/6nWgi22UT5Y7nJiPfQ_XIw",
|
||||
type: "primary",
|
||||
},
|
||||
],
|
||||
|
@ -143,7 +143,9 @@ JavaGuide 知识星球优质主题汇总传送门:<https://www.yuque.com/snail
|
||||
|
||||

|
||||
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://t.zsxq.com/12uSKgTIm)** 。
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1)** 。另外,建议你添加一下我的个人微信( **javaguide1024** ,备注 **“星球”** ,生活号,球友专属),方便后续交流沟通。
|
||||
|
||||

|
||||
|
||||
**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
|
||||
|
||||
|
@ -220,7 +220,7 @@ var="https://www.runoob.com/linux/linux-shell-variable.html"
|
||||
# 注: *为通配符, 意为匹配任意数量的任意字符
|
||||
s1=${var%%t*} #h
|
||||
s2=${var%t*} #https://www.runoob.com/linux/linux-shell-variable.h
|
||||
s3=${var%%.*} #https://www
|
||||
s3=${var%%.*} #http://www
|
||||
s4=${var#*/} #/www.runoob.com/linux/linux-shell-variable.html
|
||||
s5=${var##*/} #linux-shell-variable.html
|
||||
```
|
||||
|
@ -396,7 +396,7 @@ ALTER TABLE `cus_order` ADD INDEX id_score_name(score, name);
|
||||
索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些:
|
||||
|
||||
- ~~使用 `SELECT *` 进行查询;~~ `SELECT *` 不会直接导致索引失效(如果不走索引大概率是因为 where 查询范围过大导致的),但它可能会带来一些其他的性能问题比如造成网络传输和数据处理的浪费、无法使用索引覆盖;
|
||||
- 创建了组合索引,但查询条件未遵守最左匹配原则;
|
||||
- 创建了组合索引,但查询条件未准守最左匹配原则;
|
||||
- 在索引列上进行计算、函数、类型转换等操作;
|
||||
- 以 % 开头的 LIKE 查询比如 `LIKE '%abc';`;
|
||||
- 查询条件中使用 OR,且 OR 的前后条件中有一个列没有索引,涉及的索引都不会被使用到;
|
||||
|
@ -659,7 +659,7 @@ Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数
|
||||
|
||||

|
||||
|
||||
更多关于布隆过滤器的详细介绍可以看看我的这篇原创:[不了解布隆过滤器?一文给你整的明明白白!](https://javaguide.cn/cs-basics/data-structure/bloom-filter.html) ,强烈推荐。
|
||||
更多关于布隆过滤器的详细介绍可以看看我的这篇原创:[不了解布隆过滤器?一文给你整的明明白白!](https://javaguide.cn/cs-basics/data-structure/bloom-filter/) ,强烈推荐。
|
||||
|
||||
**3)接口限流**
|
||||
|
||||
|
@ -115,7 +115,7 @@ Disruptor 真的很快,关于它为什么这么快这个问题,会在后文
|
||||
## Disruptor 为什么这么快?
|
||||
|
||||
- **RingBuffer(环形数组)** : Disruptor 内部的 RingBuffer 是通过数组实现的。由于这个数组中的所有元素在初始化时一次性全部创建,因此这些元素的内存地址一般来说是连续的。这样做的好处是,当生产者不断往 RingBuffer 中插入新的事件对象时,这些事件对象的内存地址就能够保持连续,从而利用 CPU 缓存的局部性原理,将相邻的事件对象一起加载到缓存中,提高程序的性能。这类似于 MySQL 的预读机制,将连续的几个页预读到内存里。除此之外,RingBuffer 基于数组还支持批量操作(一次处理多个元素)、还可以避免频繁的内存分配和垃圾回收(RingBuffer 是一个固定大小的数组,当向数组中添加新元素时,如果数组已满,则新元素将覆盖掉最旧的元素)。
|
||||
- **避免了伪共享问题**:CPU 缓存内部是按照 Cache Line(缓存行)管理的,一般的 Cache Line 大小在 64 字节左右。Disruptor 为了确保目标字段独占一个 Cache Line,会在目标字段前后增加字节填充(前 56 个字节和后 56 个字节),这样可以避免 Cache Line 的伪共享(False Sharing)问题。同时,为了让 RingBuffer 存放数据的数组独占缓存行,数组的设计为 无效填充(128字节)+ 有效数据。
|
||||
- **避免了伪共享问题**:CPU 缓存内部是按照 Cache Line(缓存行)管理的,一般的 Cache Line 大小在 64 字节左右。Disruptor 为了确保目标字段独占一个 Cache Line,会在目标字段前后增加了 64 个字节的填充(前 56 个字节和后 8 个字节),这样可以避免 Cache Line 的伪共享(False Sharing)问题。
|
||||
- **无锁设计**:Disruptor 采用无锁设计,避免了传统锁机制带来的竞争和延迟。Disruptor 的无锁实现起来比较复杂,主要是基于 CAS、内存屏障(Memory Barrier)、RingBuffer 等技术实现的。
|
||||
|
||||
综上所述,Disruptor 之所以能够如此快,是基于一系列优化策略的综合作用,既充分利用了现代 CPU 缓存结构的特点,又避免了常见的并发问题和性能瓶颈。
|
||||
|
@ -36,7 +36,7 @@ icon: path
|
||||
1. 你首先搞清楚自己要找什么工作
|
||||
2. 然后根据招聘岗位的要求梳理一份技能清单
|
||||
3. 根据技能清单写好最终的简历
|
||||
4. 最后再按照简历的要求去学习和提升。
|
||||
4. 最后再按照建立的要求去学习和提升。
|
||||
|
||||
这其实也是 **以终为始** 思想的运用。
|
||||
|
||||
|
@ -246,7 +246,7 @@ public static transient void print(String strs[])
|
||||
}
|
||||
```
|
||||
|
||||
从反编译后代码可以看出,可变参数在被使用的时候,他首先会创建一个数组,数组的长度就是调用该方法是传递的实参的个数,然后再把参数值全部放到这个数组当中,然后再把这个数组作为参数传递到被调用的方法中。(注:`trasient` 仅在修饰成员变量时有意义,此处 “修饰方法” 是由于在 javassist 中使用相同数值分别表示 `trasient` 以及 `vararg`,见 [此处](https://github.com/jboss-javassist/javassist/blob/7302b8b0a09f04d344a26ebe57f29f3db43f2a3e/src/main/javassist/bytecode/AccessFlag.java#L32)。)
|
||||
从反编译后代码可以看出,可变参数在被使用的时候,他首先会创建一个数组,数组的长度就是调用该方法是传递的实参的个数,然后再把参数值全部放到这个数组当中,然后再把这个数组作为参数传递到被调用的方法中。
|
||||
|
||||
### 枚举
|
||||
|
||||
|
@ -464,8 +464,6 @@ JDK1.8 默认使用的是 Parallel Scavenge + Parallel Old,如果指定了-XX:
|
||||
- **无法处理浮动垃圾;**
|
||||
- **它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。**
|
||||
|
||||
**从 JDK9 开始,CMS 收集器已被弃用。**
|
||||
|
||||
### G1 收集器
|
||||
|
||||
**G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征.**
|
||||
@ -494,29 +492,22 @@ G1 收集器的运作大致分为以下几个步骤:
|
||||
|
||||
与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。
|
||||
|
||||
ZGC 可以将暂停时间控制在几毫秒以内,且暂停时间不受堆内存大小的影响,出现 Stop The World 的情况会更少,但代价是牺牲了一些吞吐量。ZGC 最大支持 16TB 的堆内存。
|
||||
在 ZGC 中出现 Stop The World 的情况会更少!
|
||||
|
||||
ZGC 在 Java11 中引入,处于试验阶段。经过多个版本的迭代,不断的完善和修复问题,ZGC 在 Java15 已经可以正式使用了。
|
||||
Java11 的时候 ,ZGC 还在试验阶段。经过多个版本的迭代,不断的完善和修复问题,ZGC 在 Java 15 已经可以正式使用了!
|
||||
|
||||
不过,默认的垃圾回收器依然是 G1。你可以通过下面的参数启用 ZGC:
|
||||
不过,默认的垃圾回收器依然是 G1。你可以通过下面的参数启动 ZGC:
|
||||
|
||||
```bash
|
||||
java -XX:+UseZGC className
|
||||
```
|
||||
|
||||
在 Java21 中,引入了分代 ZGC,暂停时间可以缩短到1毫秒以内。
|
||||
|
||||
你可以通过下面的参数启用分代 ZGC:
|
||||
|
||||
```bash
|
||||
java -XX:+UseZGC -XX:+ZGenerational className
|
||||
```
|
||||
|
||||
关于 ZGC 收集器的详细介绍推荐阅读美团技术团队的 [新一代垃圾回收器 ZGC 的探索与实践](https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html) 这篇文章。
|
||||
|
||||
## 参考
|
||||
|
||||
- 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第二版》
|
||||
- The Java® Virtual Machine Specification - Java SE 8 Edition:<https://docs.oracle.com/javase/specs/jvms/se8/html/index.html>
|
||||
- <https://my.oschina.net/hosee/blog/644618>
|
||||
- <https://docs.oracle.com/javase/specs/jvms/se8/html/index.html>
|
||||
|
||||
<!-- @include: @article-footer.snippet.md -->
|
||||
|
@ -7,7 +7,7 @@ heroText: JavaGuide
|
||||
tagline: 「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
|
||||
actions:
|
||||
- text: 开始阅读
|
||||
link: /home.md
|
||||
link: /home/
|
||||
type: primary
|
||||
- text: 知识星球
|
||||
link: /about-the-author/zhishixingqiu-two-years.md
|
||||
|
@ -18,7 +18,9 @@
|
||||
|
||||

|
||||
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://t.zsxq.com/12uSKgTIm)** 。
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1)** 。另外,建议你添加一下我的个人微信( **javaguide1024** ,备注 **“星球”** ,生活号,球友专属),方便后续交流沟通。
|
||||
|
||||

|
||||
|
||||
**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
|
||||
|
||||
|
@ -20,7 +20,9 @@
|
||||
|
||||

|
||||
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1)** 。
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1)** 。另外,建议你添加一下我的个人微信( **javaguide1024** ,备注 **“星球”** ,生活号,球友专属),方便后续交流沟通。
|
||||
|
||||

|
||||
|
||||
**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
|
||||
|
||||
|
@ -18,7 +18,9 @@
|
||||
|
||||

|
||||
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://t.zsxq.com/12uSKgTIm)** 。
|
||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1)** 。另外,建议你添加一下我的个人微信( **javaguide1024** ,备注 **“星球”** ,生活号,球友专属),方便后续交流沟通。
|
||||
|
||||

|
||||
|
||||
**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
|
||||
|
||||
|
@ -178,7 +178,7 @@ Session-Cookie 方案在单体环境是一个非常好的身份认证方案。
|
||||
|
||||
## 为什么 Cookie 无法防止 CSRF 攻击,而 Token 可以?
|
||||
|
||||
**CSRF(Cross Site Request Forgery)** 一般被翻译为 **跨站请求伪造** 。那么什么是 **跨站请求伪造** 呢?说简单点,就是用你的身份去发送一些对你不友好的请求。举个简单的例子:
|
||||
**CSRF(Cross Site Request Forgery)** 一般被翻译为 **跨站请求伪造** 。那么什么是 **跨站请求伪造** 呢?说简单用你的身份去发送一些对你不友好的请求。举个简单的例子:
|
||||
|
||||
小壮登录了某网上银行,他来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了 10000 元。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求。
|
||||
|
||||
@ -190,7 +190,7 @@ Session-Cookie 方案在单体环境是一个非常好的身份认证方案。
|
||||
|
||||
`Session` 认证中 `Cookie` 中的 `SessionId` 是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。
|
||||
|
||||
但是,我们使用 `Token` 的话就不会存在这个问题,在我们登录成功获得 `Token` 之后,一般会选择存放在 `localStorage` (浏览器本地存储)中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 `Token`,这样就不会出现 CSRF 漏洞的问题。因为,即使你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 `Token` 的,所以这个请求将是非法的。
|
||||
但是,我们使用 `Token` 的话就不会存在这个问题,在我们登录成功获得 `Token` 之后,一般会选择存放在 `localStorage` (浏览器本地存储)中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 `Token`,这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 `Token` 的,所以这个请求将是非法的。
|
||||
|
||||

|
||||
|
||||
|
7
pnpm-lock.yaml
generated
7
pnpm-lock.yaml
generated
@ -1,4 +1,4 @@
|
||||
lockfileVersion: '6.1'
|
||||
lockfileVersion: '6.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
@ -759,7 +759,6 @@ packages:
|
||||
resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
@ -768,7 +767,6 @@ packages:
|
||||
resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
@ -777,7 +775,6 @@ packages:
|
||||
resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
@ -786,7 +783,6 @@ packages:
|
||||
resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
@ -795,7 +791,6 @@ packages:
|
||||
resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
Loading…
x
Reference in New Issue
Block a user