[docs update] jvm 部分内容完善
表达完善,部分图片重新绘制
22
README.en.md
@ -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)
|
||||
|
@ -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>
|
||||
|
@ -19,7 +19,7 @@ title: JavaGuide(Java学习&&面试指南)
|
||||
</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>
|
||||
|
@ -155,8 +155,6 @@ Heap
|
||||
|
||||
```
|
||||
|
||||

|
||||
|
||||
### 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 {
|
||||

|
||||
|
||||
添加的参数:`-XX:+PrintGCDetails`
|
||||

|
||||

|
||||
|
||||
运行结果 (红色字体描述有误,应该是对应于 JDK1.7 的永久代):
|
||||
|
||||
@ -270,7 +267,7 @@ public class GCTest {
|
||||
|
||||
上面的说法已经在《深入理解 Java 虚拟机》第三版中被改正过来了。感谢 R 大的回答:
|
||||
|
||||

|
||||

|
||||
|
||||
**总结:**
|
||||
|
||||
@ -298,8 +295,6 @@ public class GCTest {
|
||||
|
||||
堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。
|
||||
|
||||

|
||||
|
||||
### 2.1 引用计数法
|
||||
|
||||
给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。
|
||||
@ -323,11 +318,13 @@ public class ReferenceCountingGc {
|
||||
|
||||
### 2.2 可达性分析算法
|
||||
|
||||
这个算法的基本思想就是通过一系列的称为 **“GC Roots”** 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。
|
||||
这个算法的基本思想就是通过一系列的称为 **“GC Roots”** 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。
|
||||
|
||||

|
||||
下图中的 `Object 6 ~ Object 10` 之间虽有引用关系,但它们到 GC Roots 不可达,因此为需要被回收的对象。
|
||||
|
||||
可作为 GC Roots 的对象包括下面几种:
|
||||

|
||||
|
||||
**哪些对象可以作为 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 垃圾收集算法
|
||||
|
||||

|
||||
|
||||
### 3.1 标记-清除算法
|
||||
|
||||
该算法分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题:
|
||||
@ -445,8 +440,6 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引
|
||||
|
||||
## 4 垃圾收集器
|
||||
|
||||

|
||||
|
||||
**如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。**
|
||||
|
||||
虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,**我们能做的就是根据具体应用场景选择适合自己的垃圾收集器**。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。
|
||||
|
@ -1,11 +1,10 @@
|
||||
---
|
||||
title: Java 内存区域详解
|
||||
category: Java
|
||||
tag:
|
||||
- JVM
|
||||
---
|
||||
|
||||
# Java 内存区域详解
|
||||
|
||||
如果没有特殊说明,都是针对的是 HotSpot 虚拟机。
|
||||
|
||||
## 写在前面 (常见面试题)
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
1
docs/java/jvm/pictures/jvm垃圾回收/jvm-gc-roots.drawio
Normal 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>
|
BIN
docs/java/jvm/pictures/jvm垃圾回收/jvm-gc-roots.png
Normal file
After Width: | Height: | Size: 216 KiB |
BIN
docs/java/jvm/pictures/jvm垃圾回收/rf-hotspot-vm-gc.png
Normal file
After Width: | Height: | Size: 430 KiB |
BIN
docs/java/jvm/pictures/jvm垃圾回收/run-with-PrintGCDetails.png
Normal file
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |