JVM中垃圾回收的判定标准和内存相关参数介绍

发布时间:2021-09-06 17:56:32 作者:chen
来源:亿速云 阅读:192
# 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

2.2 可达性分析法

JVM实际采用的判定方法,通过”GC Roots”对象作为起点,构建引用链:

GC Roots包括: - 虚拟机栈中引用的对象 - 方法区静态属性引用的对象 - 方法区常量引用的对象 - 本地方法栈JNI引用的对象

对象存活判定流程: 1. 标记所有与GC Roots直接或间接相连的对象为存活 2. 进行第一次标记并筛选(是否覆盖finalize()) 3. 执行finalize()方法(只会执行一次) 4. 进行第二次标记,真正回收内存

2.3 四种引用类型

引用类型 特点 回收时机 典型应用
强引用 普遍存在的引用 永不回收 Object obj = new Object()
软引用 内存不足时回收 OOM前回收 缓存实现
弱引用 下次GC时回收 无论内存是否充足 WeakHashMap
虚引用 无法获取对象 跟踪回收状态 堆外内存管理

三、JVM内存区域与GC关系

内存区域划分及GC策略:

  1. 新生代(Young Generation)

    • Eden区:对象首次分配区域
    • Survivor区(From/To):Minor GC后存活对象暂存区
    • 触发条件:Eden区满时触发Minor GC
  2. 老年代(Old Generation)

    • 存放长期存活对象
    • 触发条件:Major GC/Full GC
  3. 元空间(Metaspace)

    • JDK8+取代永久代
    • 存储类元数据信息
  4. 其他区域

    • 虚拟机栈/本地方法栈:线程私有,不涉及GC
    • 程序计数器:无GC问题

四、关键内存参数详解

4.1 堆内存参数

参数 说明 示例 建议
-Xms 初始堆大小 -Xms4g 设为与Xmx相同
-Xmx 最大堆大小 -Xmx8g 不超过物理内存80%
-Xmn 新生代大小 -Xmn2g 13 ~ 1/2总堆
-XX:NewRatio 新生代/老年代比例 -XX:NewRatio=2 默认2(老年代是新生代2倍)
-XX:SurvivorRatio Eden/Survivor比例 -XX:SurvivorRatio=8 通常8:1:1

4.2 方法区参数

参数 说明 JDK版本 建议值
-XX:PermSize 永久代初始大小 ≤JDK7 根据类加载量调整
-XX:MaxPermSize 永久代最大值 ≤JDK7
-XX:MetaspaceSize 元空间初始大小 ≥JDK8 256M
-XX:MaxMetaspaceSize 元空间最大值 ≥JDK8 不设置则无限制

4.3 GC日志参数

-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps
-Xloggc:/path/to/gc.log
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=10M

4.4 其他重要参数

垃圾回收器选择

-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      # 晋升老年代年龄阈值

五、参数配置实践建议

5.1 电商系统配置示例

# 8核16G服务器推荐配置
-Xms12g -Xmx12g 
-XX:NewRatio=1 
-XX:SurvivorRatio=8
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45

5.2 内存问题排查技巧

  1. OOM问题定位

    jmap -heap <pid>        # 查看堆内存分配
    jstat -gcutil <pid> 1000 # 动态观察GC情况
    
  2. 内存泄漏分析

    jmap -histo:live <pid> | head -20  # 查看对象数量排行
    
  3. GC优化指标

    • Young GC频率:<100ms/次
    • Full GC频率:尽量避免
    • 对象晋升率:<10%到老年代

六、总结

  1. 垃圾回收通过可达性分析准确判断对象存活状态
  2. 合理配置内存参数需要根据应用特点:
    • 高吞吐应用:优先ParallelGC
    • 低延迟应用:选择G1或ZGC
  3. 监控GC日志是性能调优的基础
  4. JDK版本升级会带来GC算法的重大改进(如ZGC/Shenandoah)

最佳实践:通过-XX:+PrintFlagsFinal参数查看所有默认值,基于实际压力测试结果进行调优。 “`

(注:实际字数约3450字,可根据需要调整具体参数示例部分的详细程度)

推荐阅读:
  1. JVM内存区域和垃圾回收的
  2. JVM中本机内存跟踪的实例介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm

上一篇:css中Padding与line-height的区别有哪些

下一篇:docker容器中查找镜像的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》