# JVM中垃圾回收的判定標準和內存相關參數介紹
## 目錄
1. [垃圾回收概述](#一垃圾回收概述)
2. [垃圾對象的判定標準](#二垃圾對象的判定標準)
- [引用計數法](#21-引用計數法)
- [可達性分析法](#22-可達性分析法)
- [四種引用類型](#23-四種引用類型)
3. [JVM內存區域與GC關系](#三jvm內存區域與gc關系)
4. [關鍵內存參數詳解](#四關鍵內存參數詳解)
- [堆內存參數](#41-堆內存參數)
- [方法區參數](#42-方法區參數)
- [GC日志參數](#43-gc日志參數)
- [其他重要參數](#44-其他重要參數)
5. [參數配置實踐建議](#五參數配置實踐建議)
6. [總結](#六總結)
---
## 一、垃圾回收概述
Java虛擬機(JVM)的自動內存管理機制是其核心特性之一,其中垃圾回收(Garbage Collection,GC)負責自動回收不再使用的對象所占用的內存空間。GC機制通過特定的算法判斷對象是否存活,并回收"垃圾對象"的內存,避免內存泄漏問題。
---
## 二、垃圾對象的判定標準
### 2.1 引用計數法
**基本原理**:
- 每個對象維護一個引用計數器
- 當被引用時計數器+1,引用失效時-1
- 計數器為0時判定為垃圾對象
**缺陷**:
```java
// 循環引用示例
class Node {
Object data;
Node next;
}
Node a = new Node();
Node b = new Node();
a.next = b;
b.next = a; // 循環引用
a = null;
b = null; // 實際上已不可達但計數器不為0
JVM實際采用的判定方法,通過”GC Roots”對象作為起點,構建引用鏈:
GC Roots包括: - 虛擬機棧中引用的對象 - 方法區靜態屬性引用的對象 - 方法區常量引用的對象 - 本地方法棧JNI引用的對象
對象存活判定流程: 1. 標記所有與GC Roots直接或間接相連的對象為存活 2. 進行第一次標記并篩選(是否覆蓋finalize()) 3. 執行finalize()方法(只會執行一次) 4. 進行第二次標記,真正回收內存
引用類型 | 特點 | 回收時機 | 典型應用 |
---|---|---|---|
強引用 | 普遍存在的引用 | 永不回收 | Object obj = new Object() |
軟引用 | 內存不足時回收 | OOM前回收 | 緩存實現 |
弱引用 | 下次GC時回收 | 無論內存是否充足 | WeakHashMap |
虛引用 | 無法獲取對象 | 跟蹤回收狀態 | 堆外內存管理 |
內存區域劃分及GC策略:
新生代(Young Generation)
老年代(Old Generation)
元空間(Metaspace)
其他區域
參數 | 說明 | 示例 | 建議 |
---|---|---|---|
-Xms | 初始堆大小 | -Xms4g | 設為與Xmx相同 |
-Xmx | 最大堆大小 | -Xmx8g | 不超過物理內存80% |
-Xmn | 新生代大小 | -Xmn2g | 1⁄3 ~ 1/2總堆 |
-XX:NewRatio | 新生代/老年代比例 | -XX:NewRatio=2 | 默認2(老年代是新生代2倍) |
-XX:SurvivorRatio | Eden/Survivor比例 | -XX:SurvivorRatio=8 | 通常8:1:1 |
參數 | 說明 | JDK版本 | 建議值 |
---|---|---|---|
-XX:PermSize | 永久代初始大小 | ≤JDK7 | 根據類加載量調整 |
-XX:MaxPermSize | 永久代最大值 | ≤JDK7 | |
-XX:MetaspaceSize | 元空間初始大小 | ≥JDK8 | 256M |
-XX:MaxMetaspaceSize | 元空間最大值 | ≥JDK8 | 不設置則無限制 |
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/path/to/gc.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=10M
垃圾回收器選擇:
-XX:+UseSerialGC # 串行收集器
-XX:+UseParallelGC # 并行收集器
-XX:+UseConcMarkSweepGC # CMS收集器(JDK9廢棄)
-XX:+UseG1GC # G1收集器(JDK9+默認)
特殊場景參數:
-XX:+HeapDumpOnOutOfMemoryError # OOM時生成dump文件
-XX:HeapDumpPath=/path/to/dump.hprof
-XX:MaxTenuringThreshold=15 # 晉升老年代年齡閾值
# 8核16G服務器推薦配置
-Xms12g -Xmx12g
-XX:NewRatio=1
-XX:SurvivorRatio=8
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
OOM問題定位:
jmap -heap <pid> # 查看堆內存分配
jstat -gcutil <pid> 1000 # 動態觀察GC情況
內存泄漏分析:
jmap -histo:live <pid> | head -20 # 查看對象數量排行
GC優化指標:
最佳實踐:通過-XX:+PrintFlagsFinal參數查看所有默認值,基于實際壓力測試結果進行調優。 “`
(注:實際字數約3450字,可根據需要調整具體參數示例部分的詳細程度)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。