【JAVA】JVM 堆内存“缓冲空间”的压缩机制及调整方法

news2025/4/17 19:11:55

1. 缓冲空间是否可压缩?

是的,JVM 会在满足条件时自动收缩堆内存,将未使用的缓冲空间释放回操作系统。但需满足以下条件:

  • GC 触发堆收缩:某些垃圾回收器(如 G1、Serial、Parallel)在 Full GC 后,若检测到堆内存空闲比例过高,会尝试收缩堆。
  • 空闲内存比例阈值:通过 -XX:MaxHeapFreeRatio 参数控制(默认 70%)。例如:
    • 当堆中空闲内存超过 70% 时,JVM 可能缩减堆大小。
    • 若未超过阈值,即使有空闲内存,JVM 也会保留缓冲空间以备后续使用。

2. 如何调整缓冲空间行为?

(1) 控制堆伸缩的敏感度

通过以下参数调节 JVM 堆内存扩展/收缩的积极性:

  • -XX:MinHeapFreeRatio=<value>(默认 40%)
    当堆空闲内存低于此值时,JVM 会尝试扩展堆。

  • -XX:MaxHeapFreeRatio=<value>(默认 70%)
    当堆空闲内存高于此值时,JVM 会尝试收缩堆。

示例:若希望堆更积极地释放内存,可降低 MaxHeapFreeRatio

java -XX:MaxHeapFreeRatio=50 -jar your_app.jar
(2) 固定堆大小(禁用动态伸缩)

将初始堆 (-Xms) 和最大堆 (-Xmx) 设为相同值,强制堆不可伸缩:

java -Xms2g -Xmx2g -jar your_app.jar
  • 优点:避免堆大小波动带来的性能开销。
  • 缺点:失去弹性,可能浪费内存或引发 OOM。
(3) 选择支持主动收缩的 GC 算法

不同垃圾回收器的堆收缩行为:

GC 类型收缩能力适用场景
G1 GC支持主动收缩(Java 9+ 优化明显)大堆、低延迟需求
Serial GCFull GC 后可能收缩单线程、小型应用
Parallel GCFull GC 后可能收缩吞吐量优先
ZGC/Shenandoah通常不主动收缩(专注于低延迟)超大堆、极致延迟要求

建议:对于需要频繁收缩堆的场景,优先选择 G1 GC。


3. 验证堆收缩效果

  • 通过 VisualVM 监控
    观察堆内存曲线,收缩时会出现阶梯式下降(如 500MB → 300MB)。

  • 查看 GC 日志
    添加参数 -Xlog:gc+heap=debug(Java 9+)或 -XX:+PrintGCDetails -XX:+PrintHeapAtGC(Java 8),日志中会出现类似输出:

    Heap after GC invocations=12 (full 1):
     capacity: 524288000 (500.0MB) → 314572800 (300.0MB)  # 堆容量缩减
    

4. 注意事项

  • 收缩延迟性:JVM 不会立即释放内存,通常需要多次 GC 后触发。
  • 性能权衡:频繁收缩/扩展堆会增加 GC 开销,需根据场景平衡内存占用与吞吐量。
  • 容器环境适配:在 Docker/K8s 中运行 Java 时,建议显式设置 -Xms-Xmx 为相同值,并配合 -XX:+UseContainerSupport(Java 10+ 默认启用)。

总结建议

场景推荐配置
常规服务-Xms512m -Xmx2g(允许动态扩展)
内存敏感环境(如容器)-Xms1g -Xmx1g(固定堆大小)
需积极释放内存-XX:MaxHeapFreeRatio=50 + G1 GC

JVM参数设置,基于1.8

-Xms1m -Xmx100m -XX:+UseG1GC -XX:+UseAdaptiveSizePolicy -XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5

    public static void main(String[] args) throws InterruptedException {
        List<String> cc=new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            cc.add("ccccccccccccccccccccccccccccccsdfs胜多负少的水电费水电费水电费是水电费水电费是水电费水电费水电费胜多负少ccc");
            // 获取当前运行时对象
            Runtime runtime = Runtime.getRuntime();

            // 总内存(JVM当前从操作系统分配的内存)
            long totalMemory = runtime.totalMemory();
            // 空闲内存(JVM未使用的内存)
            long freeMemory = runtime.freeMemory();
            // 已使用内存 = 总内存 - 空闲内存
            long usedMemory = totalMemory - freeMemory;

            // 转换为MB单位(1 MB = 1024 * 1024 Bytes)
            System.out.println("总内存: " + (totalMemory / (1024 * 1024)) + " MB");
            System.out.println("空闲内存: " + (freeMemory / (1024 * 1024)) + " MB");
            System.out.println("已使用内存: " + (usedMemory / (1024 * 1024)) + " MB");

            String vmName = ManagementFactory.getRuntimeMXBean().getName();
            long pid = Long.parseLong(vmName.split("@")[0]);
            System.out.println("PID: " + pid);

            System.out.println("============================================="+i);
            Thread.sleep(1000);
        }
    }

输出

总内存: 2 MB
空闲内存: 0 MB
已使用内存: 1 MB
PID: 641868
=============================================0
总内存: 4 MB
空闲内存: 1 MB
已使用内存: 2 MB
PID: 641868
=============================================1
总内存: 4 MB
空闲内存: 1 MB
已使用内存: 2 MB
PID: 641868
=============================================2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RV1126 人脸识别门禁系统解决方案

1. 方案简介 本方案为类人脸门禁机的产品级解决方案,已为用户构建一个带调度框架的UI应用工程;准备好我司的easyeai-api链接调用;准备好UI的开发环境。具备低模块耦合度的特点。其目的在于方便用户快速拓展自定义的业务功能模块,以及快速更换UI皮肤。 2. 快速上手 2.1 开…

matlab内置的git软件版本管理功能

1、matlab多人协作开发比普通的嵌入式软件开发困难很多 用过matlab的人都知道,版本管理对于matlab来说真的很费劲,今天介绍的这个工具也不是说它就解决了这个痛点,只是让它变得简单一点。版本管理肯定是不可或缺的,干就完了 2、操作说明 如图所示,源代码管理,选项罗列的…

《前端面试题之 CSS篇(第一集)》

目录 1、CSS的盒模型2、CSS选择器及其优先级3、隐藏元素的方法有那些4、px、em、rem的区别及使用场景5、重排、重绘有什么区别6、水平垂直居中的实现7、CSS中可继承与不可继承属性有哪些8、Sass、Less 是什么&#xff1f;为什么要使用他们&#xff1f;9、CSS预处理器/后处理器是…

MySQL部分总结

mysql学习笔记&#xff0c;如有不足还请指出&#xff0c;谢谢。 外连接&#xff0c;内连接&#xff0c;全连接 外连接&#xff1a;左外、右外 内连接&#xff1a;自己和自己连接 全连接&#xff1a;左外连接右外链接 mysql unique字段 unique可以在数据库层面避免插入相同…

Linux Kernel 2

地址空间&#xff08;Address Space&#xff09; 一、物理地址空间&#xff08;Physical Address Space&#xff09; 物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。 举例&#xff1a;在典型的 32 32 32 位 Intel 架构中&#xff0c; RAM&#xff08…

AndroidTV D贝桌面-v3.2.5-[支持文件传输]

AndroidTV D贝桌面 链接&#xff1a;https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D贝桌面-v3.2.5[支持文件传输] 第一次使用的话&#xff0c;壁纸默认去掉的&#xff0c;不需要按遥控器上键&#xff0c;自己更换壁纸即可

线性方程组的解法

文章目录 线性方程组的解法认识一些基本的矩阵函数MATLAB 实现机电工程学院教学函数构造1.高斯消元法2.列主元消去法3. L U LU LU分解法 线性方程组的解法 看到以下线性方程组的一般形式&#xff1a;设有以下的 n n n阶线性方程组&#xff1a; A x b \mathbf{Ax}\mathbf{b} A…

Python赋能量子计算:算法创新与应用拓展

量子计算与Python结合的算法开发与应用研究 摘要 量子计算作为计算机科学的前沿技术,凭借其独特的计算能力在解决复杂问题方面展现出巨大潜力。Python作为一种高效、灵活的编程语言,为量子计算算法的开发提供了强大的支持。本文从研究学者的视角,系统探讨了量子计算与Pytho…

Java学习笔记(多线程):ReentrantLock 源码分析

本文是自己的学习笔记&#xff0c;主要参考资料如下 JavaSE文档 1、AQS 概述1.1、锁的原理1.2、任务队列1.2.1、结点的状态变化 1.3、加锁和解锁的简单流程 2、ReentrantLock2.1、加锁源码分析2.1.1、tryAcquire()的具体实现2.1.2、acquirQueued()的具体实现2.1.3、tryLock的具…

【软考系统架构设计师】系统配置与性能评价知识点

1、 常见的性能指标 主频外频*倍频 主频1/CPU时钟周期 CPI&#xff08;Clock Per Instruction&#xff09;平均每条指令的平均时间周期数 IPC&#xff08;Instruction Per Clock&#xff09;每时钟周期运行指令数 MIPS百万条指令每秒 MFLOPS百万个浮点操作每秒 字长影响运算的…

解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南

AI生图自由&#xff01;就来 ChatTools (https://chat.chattools.cn)&#xff0c;畅享Midjourney免费无限绘画。同时体验GPT-4o、Claude 3.7 Sonnet、DeepSeek等强大模型。 为了帮助大家更好地驾驭Midjourney&#xff0c;我们精心整理并分类了大量常用且效果出众的提示词。无论…

大模型分布式推理和量化部署

一、小常识 1、计算大模型占用多少显存 对于一个7B(70亿)参数的模型,每个参数使用16位浮点数(等于 2个 Byte)表示,则模型的权重大小约为: 7010^9 parameters2 Bytes/parameter=14GB 70亿个参数每个参数占用2个字节=14GB 所以我们需要大于14GB的显存。注意14GB单纯是大…

【ROS】分布式通信架构

【ROS】分布式通信架构 前言环境要求主机设置&#xff08;Master&#xff09;从机设置&#xff08;Slave&#xff09;主机与从机通信测试本文示例启动ROS智能车激光雷达节点本地计算机配置与订阅 前言 在使用 ROS 时&#xff0c;我们常常会遇到某些设备计算能力不足的情况。例…

零基础HTML·笔记(持续更新…)

基础认知 HTML标签的结构 <strong>文字变粗</strong> &#xff1c;开始标签&#xff1e;内容&#xff1c;结束标签&#xff1e; 结构说明&#xff1a; 标签由<、>、1、英文单词或字母组成。并且把标签中<>包括起来的英文单词或字母称为标签名。常…

Visual Studio 2022 UI机器学习训练模块

VS你还是太超标了&#xff0c;现在机器学习都不用写代码了吗&#xff01;&#xff01; 右键项目解决方案&#xff0c;选择机器学习模型

FreeRTOS使任务处于阻塞态的API

在FreeRTOS中&#xff0c;任务进入阻塞状态通常是因为等待某个事件或资源。以下是常用的使任务进入阻塞态的API及其分类&#xff1a; 1. 任务延时 vTaskDelay(pdMS_TO_TICKS(ms)) 将任务阻塞固定时间&#xff08;相对延时&#xff0c;从调用时开始计算&#xff09;。 示例&…

独立开发者之网站的robots.txt文件如何生成和添加

robots.txt是一个存放在网站根目录下的文本文件&#xff0c;用于告诉搜索引擎爬虫哪些页面可以抓取&#xff0c;哪些页面不可以抓取。下面我将详细介绍如何生成和添加robots.txt文件。 什么是robots.txt文件&#xff1f; robots.txt是遵循"机器人排除协议"(Robots…

Leedcode刷题 | Day31_贪心算法05

一、学习任务 56. 合并区间代码随想录738. 单调递增的数字968. 监控二叉树 二、具体题目 1.56合并区间56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,1…

猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取

开发背景 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的…

粘性定位(position:sticky)——微信小程序学习笔记

1. 简介 CSS 中的粘性定位&#xff08;Sticky positioning&#xff09;是一种特殊的定位方式&#xff0c;它可以使元素在滚动时保持在视窗的特定位置&#xff0c;类似于相对定位&#xff08;relative&#xff09;&#xff0c;但当页面滚动到元素的位置时&#xff0c;它会表现得…