Skip to content

Commit 35db250

Browse files
committed
🏂图床地址从gitee为更新为腾讯云OOS 解决图片无法显示问题
1 parent 5f6f4c8 commit 35db250

19 files changed

+112
-118
lines changed

.DS_Store

10 KB
Binary file not shown.

02-运行时数据区/02-程序计数器(PC寄存器).md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ JVM中的程序计数寄存器(Program Counter Register),Register的命名
88

99
PC寄存器是用来存储指向下一条指令的地址,也即将将要执行的指令代码。由执行引擎读取下一条指令。
1010

11-
![image-20210618142925623](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210618142925623.png)
11+
![image-20210618142925623](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051426444.png)
1212

1313
## 三、特征
1414

@@ -46,7 +46,7 @@ public class PCRegisterTest {
4646

4747
利用javap -v xxx.class 反编译字节码文件,查看指令等信息
4848

49-
![image-20210618144426599](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210618144426599.png)
49+
![image-20210618144426599](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051426907.png)
5050

5151
## 五、面试常问
5252

02-运行时数据区/03-虚拟机栈.md

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
### 2、内存中的堆与栈
1111

12-
![image-20210621094710288](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210621094710288.png)
12+
![image-20210621094710288](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051426875.png)
1313

1414
- ****
1515
- 运行时的单位。
@@ -52,7 +52,7 @@ public class StackOverFlowErrorTest {
5252
```
5353
​ 递归调用main,当主线程请求分配的栈容量超过java虚拟机栈允许的最大容量,java虚拟机将会抛出一个 ==StackOverFlowError异常==。
5454

55-
![image-20210621101633260](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210621101633260.png)
55+
![image-20210621101633260](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051426607.png)
5656

5757
- 如果java虚拟机栈动态拓展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个 **==OutOfMemoryError异常==**
5858

@@ -92,7 +92,7 @@ public class StackErrorTest {
9292
- 如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧
9393
- Java方法有两种返回函数的方式,**一种是正常的函数返回,使用return指令;另外一种是抛出异常。不管使用哪种方式,都会导致栈帧被弹出。**
9494

95-
#### 2、栈帧内部的组成结构 ![image-20210621103004204](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210621103004204.png)
95+
#### 2、栈帧内部的组成结构 ![image-20210621103004204](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051426582.png)
9696

9797
每个栈帧中存储着:
9898

@@ -106,7 +106,7 @@ public class StackErrorTest {
106106

107107
#### 3、栈帧与线程
108108

109-
![image-20210621112159119](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210621112159119.png)
109+
![image-20210621112159119](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051426796.png)
110110

111111
## 三、局部变量表(Local Variables)
112112

@@ -117,7 +117,7 @@ public class StackErrorTest {
117117
- 由于局部变量表是建立在线程的栈上,是线程私有的数据,因此不存在数据安全问题
118118
- **局部变量表所需的容量大小是在编译期确定下来的**,并保存在方法的Code属性的【字节码最大长度】数据项中。在方法运行期间是不会改变局部变量表的大小的。
119119

120-
![image-20210621114340488](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210621114340488.png)
120+
![image-20210621114340488](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051426876.png)
121121

122122
- **方法嵌套调用的次数由栈的大小决定。一般来说,栈越大,方法嵌套调用次数越多。**对一个函数而言,他的参数和局部变量越多,使得局部变量表膨胀,它的栈帧就越大,以满足方法调用所需传递的信息增大的需求。进而函数调用就会占用更多的栈空间,导致其嵌套调用次数就会减少。
123123
- **局部变量表中的变量只在当前方法调用中有效。**在方法执行时,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。**当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。**
@@ -126,7 +126,7 @@ public class StackErrorTest {
126126

127127
在IDEA 上安装jclasslib byte viewcoder插件查看局部变量表信息,以main()方法为例
128128

129-
![image-20210621114111939](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210621114111939.png)
129+
![image-20210621114111939](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051427496.png)
130130

131131
#### 3、变量槽slot的理解与演示
132132

@@ -224,7 +224,7 @@ public static void main(String[] args) {
224224

225225
- 在Java源文件被编译成字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Refenrence)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么**动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。**
226226

227-
![image-20210621211858286](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210621211858286.png)
227+
![image-20210621211858286](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051427945.png)
228228

229229
#### 例子
230230

@@ -284,10 +284,6 @@ public class DynamicLinkingTest {
284284
2、在方法执行的过程中遇到了异常(Exception),并且这个异常没有在方法内进行处理,也就是只要在本方法的异常表中没有搜素到匹配的异常处理器,就会导致方法退出,简称**异常完成出口**
285285
方法执行过程中抛出异常时的异常处理,存储在一个异常处理表,方便在发生异常的时候找到处理异常的代码。
286286

287-
288-
289-
![img](https://gitee.com/ShaoxiongDu/imageBed/raw/master/170ecb82ce5a6a35.png)
290-
291287
## 十、附加信息
292288

293289
栈帧中还允许携带与java虚拟机实现相关的一些附加信息。例如,对程序调试提供支持的信息。(很多资料都忽略了附加信息)

02-运行时数据区/04-本地方法接口.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## 一、在JVM中的位置
44

5-
![image-20210622110456863](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210622110456863.png)
5+
![image-20210622110456863](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051427213.png)
66

77
## 二、定义
88

@@ -55,4 +55,3 @@ Native使用起来非常方便,然而有些层次的任务用java实现起来
5555

5656
目前该方法的是用越来越少了,除非是与硬件有关的应用,比如通过java程序驱动打印机或者java系统管理生产设备,在企业级应用已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以是用Web Service等等,不多做介绍。
5757

58-

02-运行时数据区/05-本地方法栈.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## 一、本地方法栈在运行时数据区中的位置
44

5-
![image-20210622112030112](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210622112030112.png)
5+
![image-20210622112030112](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051427068.png)
66

77
## 二、定义
88

02-运行时数据区/06-堆.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ public class HeapDemo {
3737

3838
3、终端运行jvisualvm 可以看到该进程的堆大小
3939

40-
![image-20210622120414862](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210622120414862.png)
40+
![image-20210622120414862](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428488.png)
4141

4242
#### 2、堆的细分内存结构
4343

4444
- JDK7及以前
4545
- 逻辑:新生区(伊甸园区+新幸存者1区+幸存者2区)+养老区+永久区(方法区在1.7的实现)
46-
- ![image-20210622161217211](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210622161217211.png)
46+
- ![image-20210622161217211](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428830.png)
4747
- JDK8及以后
4848
- 逻辑:新生区(伊甸园区+新幸存者1区+幸存者2区)+养老区+元空间(直接内存)(方法区在1.8的实现)
4949

@@ -109,7 +109,7 @@ D:\JVMStudy>jstat 7112
109109

110110
​ 终端输入:jstat -gc 7112 表示打印7112进程的gc情况
111111

112-
![image-20210622170458055](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210622170458055.png)
112+
![image-20210622170458055](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428414.png)
113113

114114
打印出的结果将前七项相加除以1024,得到的为600m。
115115

@@ -162,7 +162,7 @@ Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
162162

163163
- Java堆区进一步细分可以分为年轻代(YoungGen)和老年代(OldGen)
164164
- 其中年轻代可以分为伊甸园区(Eden)、新生区1(from)和新生区2(to)
165-
- ![image-20210622172128916](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210622172128916.png)
165+
- ![image-20210622172128916](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428277.png)
166166

167167
### 设置新生代老年代参数
168168

@@ -191,19 +191,19 @@ Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
191191

192192
3. 然后加载新的对象放到伊甸园区
193193

194-
![image-20210623140803974](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210623140803974.png)
194+
![image-20210623140803974](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428427.png)
195195

196196
4. 如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会放到幸存者1区。
197197

198-
![image-20210623140854954](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210623140854954.png)
198+
![image-20210623140854954](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428458.png)
199199

200200
5. 如果再次经历垃圾回收,此时会重新放回幸存者0区,接着再去幸存者1区。
201201

202202
6. 啥时候能去养老区呢?可以设置次数。默认是15次。·可以设置参数:
203203

204204
-XX:MaxTenuringThreshold=进行设置。
205205

206-
![image-20210623140931052](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210623140931052.png)
206+
![image-20210623140931052](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428162.png)
207207

208208
7. 在养老区,相对悠闲。当老年区内存不足时,再次触发GC:Major GC,进行养老区的内存清理。
209209

@@ -216,7 +216,7 @@ Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
216216

217217
### 2、对象分配的特殊情况
218218

219-
![image-20210623141531079](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210623141531079.png)
219+
![image-20210623141531079](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428589.png)
220220

221221
### 3、代码举例
222222

@@ -241,7 +241,7 @@ public class HeapInstanceTest {
241241
}
242242
```
243243

244-
![image-20210623142658708](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210623142658708.png)
244+
![image-20210623142658708](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428698.png)
245245

246246
说明:
247247

@@ -326,7 +326,7 @@ public class YoungOldAreaTest {
326326

327327
20m的buffer存放于老年代中
328328

329-
![image-20210623161830107](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210623161830107.png)
329+
![image-20210623161830107](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428461.png)
330330

331331
## 八、为对象分配内存:TLAB
332332

@@ -340,7 +340,7 @@ public class YoungOldAreaTest {
340340

341341
- 从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内
342342

343-
![image-20210625201230387](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210625201230387.png)
343+
![image-20210625201230387](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428120.png)
344344

345345
- 多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为==快速分配策略==
346346

@@ -358,7 +358,7 @@ public class YoungOldAreaTest {
358358

359359
### 4、TLAB对象分配过程
360360

361-
![image-20210625201540406](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210625201540406.png)
361+
![image-20210625201540406](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051428826.png)
362362

363363
## 九、堆空间的参数设置
364364

@@ -475,10 +475,10 @@ public class StackAllocation {
475475

476476
- 关闭逃逸分析 -XX:-DoEscapeAnalysis
477477
- 花费的时间为: 104 ms
478-
- 维护10000个对象![image-20210625205057934](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210625205057934.png)
478+
- 维护10000个对象![image-20210625205057934](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429704.png)
479479
- 开启逃逸分析(默认开启)
480480
- 花费的时间为: 6 ms
481-
- 维护少量对象![image-20210625205306816](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210625205306816.png)
481+
- 维护少量对象![image-20210625205306816](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429659.png)
482482

483483
### 2、同步省略
484484

02-运行时数据区/07-方法区.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
### 1、**运行时数据区结构图**
66

7-
![image-20210626114509388](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626114509388.png)
7+
![image-20210626114509388](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429977.png)
88

99
### 2、**堆、栈、方法区的交互关系**
1010

11-
![image-20210626114521515](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626114521515.png)
11+
![image-20210626114521515](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429830.png)
1212

1313
### 3、**方法区在jdk7及jdk8的落地实现**
1414

15-
![image-20210626151619008](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626151619008.png)
15+
![image-20210626151619008](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429699.png)
1616

1717
方法区是一种规范
1818

@@ -55,7 +55,7 @@
5555
}
5656
```
5757

58-
![image-20210626152501186](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626152501186.png)
58+
![image-20210626152501186](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429763.png)
5959

6060
## 三、设置方法区大小与OOM
6161

@@ -130,13 +130,13 @@
130130

131131
### 1、方法区在运行时数据区中的位置
132132

133-
![image-20210626160816829](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626160816829.png)
133+
![image-20210626160816829](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429404.png)
134134

135135
### 2、方法区存储的信息
136136

137137
方法区用于存储已被虚拟机加载的==类型信息、常量、静态变量、即时编译器编译后的代码缓存==等。
138138

139-
![image-20210626160857167](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626160857167.png)
139+
![image-20210626160857167](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429542.png)
140140

141141
- 类型信息
142142
- 运行时常量池
@@ -183,11 +183,11 @@ JVM必须保存所有方法的以下信息,同域信息一样包括声明顺
183183

184184
##### 类文件中的常量池
185185

186-
![image-20210626164021598](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626164021598.png)
186+
![image-20210626164021598](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429336.png)
187187

188188
- 一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息那就是常量池表(Constant Poo1 Table),包括各种字面量和对类型域和方法的符号引用。
189189

190-
![image-20210626174847203](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626174847203.png)
190+
![image-20210626174847203](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051429355.png)
191191

192192
- 一个 java 源文件中的类、接口,编译后产生一个字节码文件。而 Java 中的字节码需要数据支持,通常这种数据会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池.
193193

@@ -260,7 +260,7 @@ public class MethodAreaDemo {
260260
25 return
261261
```
262262

263-
![image-20210626180931785](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626180931785.png)
263+
![image-20210626180931785](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051430013.png)
264264

265265
## 六、方法区的演进细节
266266

@@ -274,11 +274,11 @@ public class MethodAreaDemo {
274274
| jdk1.7 | 有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移除,保存在堆中 |
275275
| jdk1.8及之后 | 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆 |
276276

277-
![image-20210626181629116](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626181629116.png)
277+
![image-20210626181629116](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051430296.png)
278278

279-
![image-20210626181640746](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626181640746.png)
279+
![image-20210626181640746](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051430077.png)
280280

281-
![image-20210626181651386](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626181651386.png)
281+
![image-20210626181651386](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051430503.png)
282282

283283
#### 永久代为什么要被元空间替换
284284

@@ -318,7 +318,7 @@ jdk7中将StringTable放到了堆空间中。因为永久代的回收效率很
318318

319319
## 八、总结
320320

321-
![image-20210626184245791](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210626184245791.png)
321+
![image-20210626184245791](https://images-1301128659.cos.ap-beijing.myqcloud.com/MacBookPro202208051430192.png)
322322

323323
## 常见面试
324324
### 百度

0 commit comments

Comments
 (0)