1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

[docs update] jvm 部分内容完善

表达完善,部分图片重新绘制
This commit is contained in:
guide 2022-02-10 14:12:38 +08:00
parent 83d0607101
commit 4cdd53db22
18 changed files with 64 additions and 53 deletions

View File

@ -33,7 +33,7 @@ Read in other languages: [Mandarin](https://github.com/Snailclimb/JavaGuide/blob
<tr>
<td align="center" valign="middle">
<a href="https://sourl.cn/e7ee87">
<img src="./media/sponsor/知识星球.png" style="margin: 0 auto;width:850px" /></a>
<img src="./media/sponsor/xingqiu.png" style="margin: 0 auto;width:850px" /></a>
</td>
</tr>
</tbody>
@ -163,7 +163,25 @@ In addition[GeeksforGeeks]( https://www.geeksforgeeks.org/fundamentals-of-alg
**Important knowledge points:**
1. [MySQL Database Indexing Summary](docs/database/mysql/mysql-index.md)
1. <div align="center">
<p>
<a href="https://github.com/Snailclimb/JavaGuide" target="_blank">
<img src="https://img-blog.csdnimg.cn/img_convert/1c00413c65d1995993bf2b0daf7b4f03.png#pic_center" width="" />
</a>
</p>
<p>
<a href="https://javaguide.cn/"><img src="https://img.shields.io/badge/阅读-read-brightgreen.svg" alt="阅读" /></a>
<img src="https://img.shields.io/github/stars/Snailclimb/JavaGuide" alt="stars" />
<img src="https://img.shields.io/github/forks/Snailclimb/JavaGuide" alt="forks" />
<img src="https://img.shields.io/github/issues/Snailclimb/JavaGuide" alt="issues" />
</p>
<p>
<a href="https://sourl.cn/psyWaE">
<img src="../media/sponsor/xingqiu.png" style="margin: 0 auto; width: 850px;" />
</a>
</p>
</div>
2. [Transaction isolation level (graphic detail)](docs/database/mysql/transaction-isolation-level.md)
3. [MySQL's Three Major Logs (binlog, redo log and undo log) Explained](docs/database/mysql/mysql-logs.md)
4. [InnoDB storage engine implementation of MVCC](docs/database/mysql/innodb-implementation-of-mvcc.md)

View File

@ -32,7 +32,7 @@
<tr>
<td align="center" valign="middle">
<a href="https://sourl.cn/psyWaE">
<img src="./media/sponsor/知识星球.png" style="margin: 0 auto;width:850px" /></a>
<img src="./media/sponsor/xingqiu.png" style="margin: 0 auto;width:850px" /></a>
</td>
</tr>
</tbody>

View File

@ -19,7 +19,7 @@ title: JavaGuideJava学习&&面试指南)
</p>
<p>
<a href="https://sourl.cn/psyWaE">
<img src="../media/sponsor/知识星球.png" style="margin: 0 auto; width: 850px;" />
<img src="../media/sponsor/xingqiu.png" style="margin: 0 auto; width: 850px;" />
</a>
</p>
</div>

View File

@ -48,20 +48,20 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作**GC 堆G
>
> ```c++
> uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
> //survivor_capacity是survivor空间的大小
> size_t desired_survivor_size = (size_t)((((double)survivor_capacity)*TargetSurvivorRatio)/100);
> size_t total = 0;
> uint age = 1;
> while (age < table_size) {
> //sizes数组是每个年龄段对象大小
> total += sizes[age];
> if (total > desired_survivor_size) {
> break;
> }
> age++;
> }
> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
> ...
> //survivor_capacity是survivor空间的大小
> size_t desired_survivor_size = (size_t)((((double)survivor_capacity)*TargetSurvivorRatio)/100);
> size_t total = 0;
> uint age = 1;
> while (age < table_size) {
> //sizes数组是每个年龄段对象大小
> total += sizes[age];
> if (total > desired_survivor_size) {
> break;
> }
> age++;
> }
> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
> ...
> }
>
> ```
@ -155,8 +155,6 @@ Heap
```
![堆内存常见分配策略 ](./pictures/jvm垃圾回收/堆内存.png)
### 1.1 对象优先在 eden 区分配
目前主流的垃圾收集器都会采用分代回收算法,因此需要将堆内存分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
@ -167,7 +165,6 @@ Heap
```java
public class GCTest {
public static void main(String[] args) {
byte[] allocation1, allocation2;
allocation1 = new byte[30900*1024];
@ -180,7 +177,7 @@ public class GCTest {
![](./pictures/jvm垃圾回收/25178350.png)
添加的参数:`-XX:+PrintGCDetails`
![](./pictures/jvm垃圾回收/10317146.png)
![](./pictures/jvm垃圾回收/run-with-PrintGCDetails.png)
运行结果 (红色字体描述有误,应该是对应于 JDK1.7 的永久代)
@ -244,12 +241,12 @@ public class GCTest {
> size_t total = 0;
> uint age = 1;
> while (age < table_size) {
> //sizes数组是每个年龄段对象大小
> total += sizes[age];
> if (total > desired_survivor_size) {
> break;
> }
> age++;
> //sizes数组是每个年龄段对象大小
> total += sizes[age];
> if (total > desired_survivor_size) {
> break;
> }
> age++;
> }
> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
> ...
@ -270,7 +267,7 @@ public class GCTest {
上面的说法已经在《深入理解 Java 虚拟机》第三版中被改正过来了。感谢 R 大的回答:
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2020-8/b48228c2-ac00-4668-a78f-6f221f8563b5.png)
![](./pictures/jvm垃圾回收/rf-hotspot-vm-gc.png)
**总结:**
@ -298,8 +295,6 @@ public class GCTest {
堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。
![](./pictures/jvm垃圾回收/11034259.png)
### 2.1 引用计数法
给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1当引用失效计数器就减 1任何时候计数器为 0 的对象就是不可能再被使用的。
@ -323,11 +318,13 @@ public class ReferenceCountingGc {
### 2.2 可达性分析算法
这个算法的基本思想就是通过一系列的称为 **“GC Roots”** 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。
这个算法的基本思想就是通过一系列的称为 **“GC Roots”** 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收
![可达性分析算法 ](./pictures/jvm垃圾回收/72762049.png)
下图中的 `Object 6 ~ Object 10` 之间虽有引用关系,但它们到 GC Roots 不可达,因此为需要被回收的对象。
可作为 GC Roots 的对象包括下面几种:
![可达性分析算法](./pictures/jvm垃圾回收/jvm-gc-roots.png)
**哪些对象可以作为 GC Roots 呢?**
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 本地方法栈(Native 方法)中引用的对象
@ -335,6 +332,19 @@ public class ReferenceCountingGc {
- 方法区中常量引用的对象
- 所有被同步锁持有的对象
**对象可以被回收,就代表一定会被回收吗?**
即使在可达性分析法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑阶段”,要真正宣告一个对象死亡,至少要经历两次标记过程;可达性分析法中不可达的对象被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 `finalize` 方法。当对象没有覆盖 `finalize` 方法,或 `finalize` 方法已经被虚拟机调用过时,虚拟机将这两种情况视为没有必要执行。
被判定为需要执行的对象将会被放在一个队列中进行第二次标记,除非这个对象与引用链上的任何一个对象建立关联,否则就会被真的回收。
> `Object` 类中的 `finalize` 方法一直被认为是一个糟糕的设计,成为了 Java 语言的负担,影响了 Java 语言的安全和 GC 的性能。JDK9 版本及后续版本中各个类中的 `finalize` 方法会被逐渐弃用移除。忘掉它的存在吧!
>
> 参考:
>
> - [JEP 421: Deprecate Finalization for Removal](https://openjdk.java.net/jeps/421)
> - [是时候忘掉 finalize 方法了](https://mp.weixin.qq.com/s/LW-paZAMD08DP_3-XCUxmg)
### 2.3 再谈引用
无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判定对象的存活都与“引用”有关。
@ -369,19 +379,6 @@ JDK1.2 以后Java 对引用的概念进行了扩充,将引用分为强引
特别注意,在程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为**软引用可以加速 JVM 对垃圾内存的回收速度可以维护系统的运行安全防止内存溢出OutOfMemory等问题的产生**。
### 2.4 不可达的对象并非“非死不可”
即使在可达性分析法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑阶段”,要真正宣告一个对象死亡,至少要经历两次标记过程;可达性分析法中不可达的对象被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 `finalize` 方法。当对象没有覆盖 `finalize` 方法,或 `finalize` 方法已经被虚拟机调用过时,虚拟机将这两种情况视为没有必要执行。
被判定为需要执行的对象将会被放在一个队列中进行第二次标记,除非这个对象与引用链上的任何一个对象建立关联,否则就会被真的回收。
> `Object` 类中的 `finalize` 方法一直被认为是一个糟糕的设计,成为了 Java 语言的负担,影响了 Java 语言的安全和 GC 的性能。JDK9 版本及后续版本中各个类中的 `finalize` 方法会被逐渐弃用移除。忘掉它的存在吧!
>
> 参考:
>
> - [JEP 421: Deprecate Finalization for Removal](https://openjdk.java.net/jeps/421)
> - [是时候忘掉 finalize 方法了](https://mp.weixin.qq.com/s/LW-paZAMD08DP_3-XCUxmg)
### 2.5 如何判断一个常量是废弃常量?
运行时常量池主要回收的是废弃的常量。那么,我们如何判断一个常量是废弃常量呢?
@ -410,8 +407,6 @@ JDK1.2 以后Java 对引用的概念进行了扩充,将引用分为强引
## 3 垃圾收集算法
![垃圾收集算法分类](./pictures/jvm垃圾回收/垃圾收集算法.png)
### 3.1 标记-清除算法
该算法分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题:
@ -445,8 +440,6 @@ JDK1.2 以后Java 对引用的概念进行了扩充,将引用分为强引
## 4 垃圾收集器
![垃圾收集器分类](./pictures/jvm垃圾回收/垃圾收集器.png)
**如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。**
虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,**我们能做的就是根据具体应用场景选择适合自己的垃圾收集器**。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。

View File

@ -1,11 +1,10 @@
---
title: Java 内存区域详解
category: Java
tag:
- JVM
---
# Java 内存区域详解
如果没有特殊说明,都是针对的是 HotSpot 虚拟机。
## 写在前面 (常见面试题)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2022-02-10T05:45:37.077Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="2NW-OnovfJmii9ta4bLM" version="13.4.5" type="device"><diagram id="_ucA3QbZEiLBh5pHRP8F" name="Page-1">7Vpbb9owGP01eeyUxLk+AqWdqk2b2qnrniaTmCStiZkxBfrrZycOuSNaURkQ6kPj4zi2z/nOF9tEA6PZ+pbCefydhAhrph6uNXCtmaZh6A7/J5BNjvi+mwMRTUJ5Uwk8JG9IgrpEl0mIFrUbGSGYJfM6GJA0RQGrYZBSsqrfNiW43uscRqgFPAQQt9HfScjiHPVMt8S/oiSKi54Nx89rZrC4Wc5kEcOQrCoQGGtgRAlh+dVsPUJYkFfwkre76andDoyilO3T4Gk2/Jvcx4+Tu19vhrlcJHeP6yvTkoNjm2LGKOQEyCKhLCYRSSEel+iQkmUaIvFYnZcWL4gFYqoGL5QNvhEyl+AzYmwjpYVLRjgUsxmWtQtGycuW3BIZEUxoNiTgBB6aTHnNNMG4gocQedOA4/kkxMh7yZHQgixpgHYwUgQZpBFiu5jbSshjH5EZYnTD21GEIUte6+OAMgij7X2lTvxCSvUe2eyLbB+TDaiUTT73FeKl7OmWP0i/5zlg0RYUY57khHCrOGHoYQ4zAlY8z9aVmJKUSZlMvc32dIqcIOjSJ3T9id6KBTlGRBla75alTWPRwJE5TyZ9w5flVZlCjSIvxpX06emfZRjnYpiO/LWHYSylea5lmB+TZ/GaN3WjLeiBDLNlu1+fQxvGqvsFANV+Af3Em+dE/JbBo2G+WFleMlUtA+2RqRyVmcrqNww4J8M0MpWl/M1u9xPfsbc5XeKbmUo986anPFOhdcKeKtd/xHO/2LJ0vZbdZIVNUUj55J/yG22vAERL44tu2gVQNs5KtdY/EU04h4gW0ziuhOnsmTBtlQnT6fdtx+b2dH3bSJiOrdq2oGPlrGSBUWF/4tmW3e2k5m7WC1Bw6LMDsKdhDFelY0DHQuIi3H7CKU11xo7dVMe5xKHOfQrCd4h24FznmMe2mwLqz7er643qaqNcW3SvNI7Na/a+XvOUem3HfqBjvXq6XnNBYz/gKfdax8nQxWsf8pq7r9d8pV5z+73WcYp1ul6zzWPzmuH1U1/8dH4e3DfznPoNlOH3c++fE/XNsFdPPWi/3bWxrXm2NhhpY0sbjjTfzZAbbcgvbjJkcAdf4a34kEQzHczHOJzQmkjOv6X4CiOT4GqRaTAQRnLm64zJop5fRdl/0dW15vM+PY1PlvdfdJV3w0fgA23QPsjgYrBdW6qUpKihvYQgTqKUFwMunjh4GgppkwDigayYJWGI++Ks/prFcILwEAYvUYY3Oy8D0XBkuRJuw+wveybjLxki+r4CnxF/oPEzsmV2xJ/XEX/G++OPF8tPcbK6ygdNYPwf</diagram></mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB