Skip to content

Commit 1143429

Browse files
committed
style: update linter
1 parent 7ea99a8 commit 1143429

13 files changed

+121
-121
lines changed

docs/.vuepress/theme.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export default hopeTheme({
7979
return path.resolve(
8080
__dirname,
8181
"../snippets",
82-
file.replace("@", "./")
82+
file.replace("@", "./"),
8383
);
8484

8585
return path.resolve(cwd, file);

docs/java/jvm/classloader.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ public abstract class ClassLoader {
8686

8787
JVM 中内置了三个重要的 `ClassLoader`
8888

89-
1. **`BootstrapClassLoader`(启动类加载器)**:最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( `%JAVA_HOME%/lib`目录下的 `rt.jar``resources.jar``charsets.jar`等 jar 包和类)以及被 `-Xbootclasspath`参数指定的路径下的所有类。
90-
2. **`ExtensionClassLoader`(扩展类加载器)**:主要负责加载 `%JRE_HOME%/lib/ext` 目录下的 jar 包和类以及被 `java.ext.dirs` 系统变量所指定的路径下的所有类。
91-
3. **`AppClassLoader`(应用程序类加载器)**:面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。
89+
1. **`BootstrapClassLoader`(启动类加载器)**:最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( `%JAVA_HOME%/lib`目录下的 `rt.jar``resources.jar``charsets.jar`等 jar 包和类)以及被 `-Xbootclasspath`参数指定的路径下的所有类。
90+
2. **`ExtensionClassLoader`(扩展类加载器)**:主要负责加载 `%JRE_HOME%/lib/ext` 目录下的 jar 包和类以及被 `java.ext.dirs` 系统变量所指定的路径下的所有类。
91+
3. **`AppClassLoader`(应用程序类加载器)**:面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。
9292

9393
> 🌈 拓展一下:
9494
>
@@ -341,10 +341,10 @@ cl = Thread.currentThread().getContextClassLoader();
341341
## 推荐阅读
342342

343343
- 《深入拆解 Java 虚拟机》
344-
- 深入分析 Java ClassLoader 原理:https://blog.csdn.net/xyang81/article/details/7292380
345-
- Java 类加载器(ClassLoader):http://gityuan.com/2016/01/24/java-classloader/
346-
- Class Loaders in Java:https://www.baeldung.com/java-classloaders
347-
- Class ClassLoader - Oracle 官方文档:https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html
348-
- 老大难的 Java ClassLoader 再不理解就老了:https://zhuanlan.zhihu.com/p/51374915
344+
- 深入分析 Java ClassLoader 原理:<https://blog.csdn.net/xyang81/article/details/7292380>
345+
- Java 类加载器(ClassLoader):<http://gityuan.com/2016/01/24/java-classloader/>
346+
- Class Loaders in Java:<https://www.baeldung.com/java-classloaders>
347+
- Class ClassLoader - Oracle 官方文档:<https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html>
348+
- 老大难的 Java ClassLoader 再不理解就老了:<https://zhuanlan.zhihu.com/p/51374915>
349349

350350
<!-- @include: @article-footer.snippet.md -->

docs/java/jvm/jvm-garbage-collection.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ $ java -XX:+UseZGC className
507507
## 参考
508508
509509
- 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第二版》
510-
- https://my.oschina.net/hosee/blog/644618
510+
- <https://my.oschina.net/hosee/blog/644618>
511511
- <https://docs.oracle.com/javase/specs/jvms/se8/html/index.html>
512512
513513
<!-- @include: @article-footer.snippet.md -->

docs/java/jvm/jvm-intro.md

+25-25
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ tag:
55
- JVM
66
---
77

8-
> 来自[说出你的愿望吧丷](https://juejin.im/user/5c2400afe51d45451758aa96)投稿,原文地址:https://juejin.im/post/5e1505d0f265da5d5d744050
8+
> 来自[说出你的愿望吧丷](https://juejin.im/user/5c2400afe51d45451758aa96)投稿,原文地址:<https://juejin.im/post/5e1505d0f265da5d5d744050>
99
1010
## 前言
1111

@@ -71,12 +71,12 @@ JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,
7171

7272
执行 main 方法的步骤如下:
7373

74-
1. 编译好 App.java 后得到 App.class 后,执行 App.class,系统会启动一个 JVM 进程,从 classpath 路径中找到一个名为 App.class 的二进制文件,将 App 的类信息加载到运行时数据区的方法区内,这个过程叫做 App 类的加载
75-
2. JVM 找到 App 的主程序入口,执行 main 方法
76-
3. 这个 main 中的第一条语句为 Student student = new Student("tellUrDream") ,就是让 JVM 创建一个 Student 对象,但是这个时候方法区中是没有 Student 类的信息的,所以 JVM 马上加载 Student 类,把 Student 类的信息放到方法区中
77-
4. 加载完 Student 类后,JVM 在堆中为一个新的 Student 实例分配内存,然后调用构造函数初始化 Student 实例,这个 Student 实例持有 **指向方法区中的 Student 类的类型信息** 的引用
78-
5. 执行 student.sayName();时,JVM 根据 student 的引用找到 student 对象,然后根据 student 对象持有的引用定位到方法区中 student 类的类型信息的方法表,获得 sayName() 的字节码地址。
79-
6. 执行 sayName()
74+
1. 编译好 App.java 后得到 App.class 后,执行 App.class,系统会启动一个 JVM 进程,从 classpath 路径中找到一个名为 App.class 的二进制文件,将 App 的类信息加载到运行时数据区的方法区内,这个过程叫做 App 类的加载
75+
2. JVM 找到 App 的主程序入口,执行 main 方法
76+
3. 这个 main 中的第一条语句为 Student student = new Student("tellUrDream") ,就是让 JVM 创建一个 Student 对象,但是这个时候方法区中是没有 Student 类的信息的,所以 JVM 马上加载 Student 类,把 Student 类的信息放到方法区中
77+
4. 加载完 Student 类后,JVM 在堆中为一个新的 Student 实例分配内存,然后调用构造函数初始化 Student 实例,这个 Student 实例持有 **指向方法区中的 Student 类的类型信息** 的引用
78+
5. 执行 student.sayName();时,JVM 根据 student 的引用找到 student 对象,然后根据 student 对象持有的引用定位到方法区中 student 类的类型信息的方法表,获得 sayName() 的字节码地址。
79+
6. 执行 sayName()
8080

8181
其实也不用管太多,只需要知道对象实例初始化时会去方法区中找类信息,完成后再到栈那里去运行方法。找方法就在方法表中找。
8282

@@ -90,15 +90,15 @@ JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,
9090

9191
#### 2.1.1 加载
9292

93-
1. 将 class 文件加载到内存
94-
2. 将静态数据结构转化成方法区中运行时的数据结构
95-
3. 在堆中生成一个代表这个类的 java.lang.Class 对象作为数据访问的入口
93+
1. 将 class 文件加载到内存
94+
2. 将静态数据结构转化成方法区中运行时的数据结构
95+
3. 在堆中生成一个代表这个类的 java.lang.Class 对象作为数据访问的入口
9696

9797
#### 2.1.2 链接
9898

99-
1. 验证:确保加载的类符合 JVM 规范和安全,保证被校验类的方法在运行时不会做出危害虚拟机的事件,其实就是一个安全检查
100-
2. 准备:为 static 变量在方法区中分配内存空间,设置变量的初始值,例如 static int a = 3 (注意:准备阶段只设置类中的静态变量(方法区中),不包括实例变量(堆内存中),实例变量是对象初始化时赋值的)
101-
3. 解析:虚拟机将常量池内的符号引用替换为直接引用的过程(符号引用比如我现在 import java.util.ArrayList 这就算符号引用,直接引用就是指针或者对象地址,注意引用对象一定是在内存进行)
99+
1. 验证:确保加载的类符合 JVM 规范和安全,保证被校验类的方法在运行时不会做出危害虚拟机的事件,其实就是一个安全检查
100+
2. 准备:为 static 变量在方法区中分配内存空间,设置变量的初始值,例如 static int a = 3 (注意:准备阶段只设置类中的静态变量(方法区中),不包括实例变量(堆内存中),实例变量是对象初始化时赋值的)
101+
3. 解析:虚拟机将常量池内的符号引用替换为直接引用的过程(符号引用比如我现在 import java.util.ArrayList 这就算符号引用,直接引用就是指针或者对象地址,注意引用对象一定是在内存进行)
102102

103103
#### 2.1.3 初始化
104104

@@ -114,10 +114,10 @@ GC 将无用对象从内存中卸载
114114

115115
加载一个 Class 类的顺序也是有优先级的,类加载器从最底层开始往上的顺序是这样的
116116

117-
1. BootStrap ClassLoader:rt.jar
118-
2. Extension ClassLoader: 加载扩展的 jar 包
119-
3. App ClassLoader:指定的 classpath 下面的 jar 包
120-
4. Custom ClassLoader:自定义的类加载器
117+
1. BootStrap ClassLoader:rt.jar
118+
2. Extension ClassLoader: 加载扩展的 jar 包
119+
3. App ClassLoader:指定的 classpath 下面的 jar 包
120+
4. Custom ClassLoader:自定义的类加载器
121121

122122
### 2.3 双亲委派机制
123123

@@ -190,7 +190,7 @@ public class Person{
190190

191191
局部变量表用于存放方法参数和方法内部所定义的局部变量。它的容量是以 Slot 为最小单位,一个 slot 可以存放 32 位以内的数据类型。
192192

193-
虚拟机通过索引定位的方式使用局部变量表,范围为[0,局部变量表的 slot 的数量]。方法中的参数就会按一定顺序排列在这个局部变量表中,至于怎么排的我们可以先不关心。而为了节省栈帧空间,这些 slot 是可以复用的,当方法执行位置超过了某个变量,那么这个变量的 slot 可以被其它变量复用。当然如果需要复用,那我们的垃圾回收自然就不会去动这些内存。
193+
虚拟机通过索引定位的方式使用局部变量表,范围为 `[0,局部变量表的 slot 的数量]`。方法中的参数就会按一定顺序排列在这个局部变量表中,至于怎么排的我们可以先不关心。而为了节省栈帧空间,这些 slot 是可以复用的,当方法执行位置超过了某个变量,那么这个变量的 slot 可以被其它变量复用。当然如果需要复用,那我们的垃圾回收自然就不会去动这些内存。
194194

195195
#### 3.3.6 虚拟机堆的概念
196196

@@ -239,11 +239,11 @@ MaxMetaspaceSize:限制元空间大小上限,防止占用过多物理内存
239239

240240
(了解一下即可)在 Java 语言汇总能作为 GC Roots 的对象分为以下几种:
241241

242-
1. 虚拟机栈(栈帧中的本地方法表)中引用的对象(局部变量)
243-
2. 方法区中静态变量所引用的对象(静态变量)
244-
3. 方法区中常量引用的对象
245-
4. 本地方法栈(即 native 修饰的方法)中 JNI 引用的对象(JNI 是 Java 虚拟机调用对应的 C 函数的方式,通过 JNI 函数也可以创建新的 Java 对象。且 JNI 对于对象的局部引用或者全局引用都会把它们指向的对象都标记为不可回收)
246-
5. 已启动的且未终止的 Java 线程
242+
1. 虚拟机栈(栈帧中的本地方法表)中引用的对象(局部变量)
243+
2. 方法区中静态变量所引用的对象(静态变量)
244+
3. 方法区中常量引用的对象
245+
4. 本地方法栈(即 native 修饰的方法)中 JNI 引用的对象(JNI 是 Java 虚拟机调用对应的 C 函数的方式,通过 JNI 函数也可以创建新的 Java 对象。且 JNI 对于对象的局部引用或者全局引用都会把它们指向的对象都标记为不可回收)
246+
5. 已启动的且未终止的 Java 线程
247247

248248
这种方法的优点是能够解决循环引用的问题,可它的实现需要耗费大量资源和时间,也需要 GC(它的分析过程引用关系不能发生变化,所以需要停止所有进程)
249249

@@ -259,8 +259,8 @@ finalize()是 Object 类的一个方法、一个对象的 finalize()方法只会
259259

260260
判断一个对象的死亡至少需要两次标记
261261

262-
1. 如果对象进行可达性分析之后没发现与 GC Roots 相连的引用链,那它将会第一次标记并且进行一次筛选。判断的条件是决定这个对象是否有必要执行 finalize()方法。如果对象有必要执行 finalize()方法,则被放入 F-Queue 队列中。
263-
2. GC 对 F-Queue 队列中的对象进行二次标记。如果对象在 finalize()方法中重新与引用链上的任何一个对象建立了关联,那么二次标记时则会将它移出“即将回收”集合。如果此时对象还没成功逃脱,那么只能被回收了。
262+
1. 如果对象进行可达性分析之后没发现与 GC Roots 相连的引用链,那它将会第一次标记并且进行一次筛选。判断的条件是决定这个对象是否有必要执行 finalize()方法。如果对象有必要执行 finalize()方法,则被放入 F-Queue 队列中。
263+
2. GC 对 F-Queue 队列中的对象进行二次标记。如果对象在 finalize()方法中重新与引用链上的任何一个对象建立了关联,那么二次标记时则会将它移出“即将回收”集合。如果此时对象还没成功逃脱,那么只能被回收了。
264264

265265
如果确定对象已经死亡,我们又该如何回收这些垃圾呢
266266

docs/java/jvm/memory-area.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作 **GC 堆(
133133
>
134134
> ```c++
135135
> uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
136-
> //survivor_capacity是survivor空间的大小
136+
> //survivor_capacity是survivor空间的大小
137137
> size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
138138
> size_t total = 0;
139139
> uint age = 1;
@@ -143,7 +143,7 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作 **GC 堆(
143143
> age++;
144144
> }
145145
> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
146-
> ...
146+
> ...
147147
> }
148148
> ```
149149
@@ -344,10 +344,10 @@ HotSpot 虚拟机主要使用的就是这种方式来进行对象访问。
344344
345345
- 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第二版》
346346
- 《自己动手写 Java 虚拟机》
347-
- Chapter 2. The Structure of the Java Virtual Machine:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html
348-
- JVM 栈帧内部结构-动态链接:https://chenxitag.com/archives/368
349-
- Java 中 new String("字面量") 中 "字面量" 是何时进入字符串常量池的? - 木女孩的回答 - 知乎:https://www.zhihu.com/question/55994121/answer/147296098
350-
- JVM 常量池中存储的是对象还是引用呢? - RednaxelaFX 的回答 - 知乎:https://www.zhihu.com/question/57109429/answer/151717241
347+
- Chapter 2. The Structure of the Java Virtual Machine:<https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html>
348+
- JVM 栈帧内部结构-动态链接:<https://chenxitag.com/archives/368>
349+
- Java 中 new String("字面量") 中 "字面量" 是何时进入字符串常量池的? - 木女孩的回答 - 知乎:<https://www.zhihu.com/question/55994121/answer/147296098>
350+
- JVM 常量池中存储的是对象还是引用呢? - RednaxelaFX 的回答 - 知乎:<https://www.zhihu.com/question/57109429/answer/151717241>
351351
- <http://www.pointsoftware.ch/en/under-the-hood-runtime-data-areas-javas-memory-model/>
352352
- <https://dzone.com/articles/jvm-permgen-%E2%80%93-where-art-thou>
353353
- <https://stackoverflow.com/questions/9095748/method-area-and-permgen>

docs/java/new-features/java10.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,10 @@ Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2
110110

111111
## 参考
112112

113-
- Java 10 Features and Enhancements : https://howtodoinjava.com/java10/java10-features/
113+
- Java 10 Features and Enhancements : <https://howtodoinjava.com/java10/java10-features/>
114114

115115
- Guide to Java10 : <https://www.baeldung.com/java-10-overview>
116116

117-
- 4 Class Data Sharing : https://docs.oracle.com/javase/10/vm/class-data-sharing.htm#JSJVM-GUID-7EAA3411-8CF0-4D19-BD05-DF5E1780AA91
117+
- 4 Class Data Sharing : <https://docs.oracle.com/javase/10/vm/class-data-sharing.htm#JSJVM-GUID-7EAA3411-8CF0-4D19-BD05-DF5E1780AA91>
118118

119119
<!-- @include: @article-footer.snippet.md -->

docs/java/new-features/java11.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ Consumer<String> consumer = (String i) -> System.out.println(i);
125125

126126
## 参考
127127

128-
- JDK 11 Release Notes:https://www.oracle.com/java/technologies/javase/11-relnote-issues.html
128+
- JDK 11 Release Notes:<https://www.oracle.com/java/technologies/javase/11-relnote-issues.html>
129129
- Java 11 – Features and Comparison:<https://www.geeksforgeeks.org/java-11-features-and-comparison/>
130130

131131
<!-- @include: @article-footer.snippet.md -->

docs/java/new-features/java16.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ if (o instanceof String s) {
115115

116116
```java
117117
public class Outer {
118-
class Inner {
119-
static int age;
120-
}
118+
class Inner {
119+
static int age;
120+
}
121121
}
122122
```
123123

0 commit comments

Comments
 (0)