【JAVA】JVM 堆内存“缓冲空间”的压缩机制及调整方法
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 GC | Full GC 后可能收缩 | 单线程、小型应用 |
| Parallel GC | Full 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
相关文章:
【JAVA】JVM 堆内存“缓冲空间”的压缩机制及调整方法
1. 缓冲空间是否可压缩? 是的,JVM 会在满足条件时自动收缩堆内存,将未使用的缓冲空间释放回操作系统。但需满足以下条件: GC 触发堆收缩:某些垃圾回收器(如 G1、Serial、Parallel)在 Full GC …...
RV1126 人脸识别门禁系统解决方案
1. 方案简介 本方案为类人脸门禁机的产品级解决方案,已为用户构建一个带调度框架的UI应用工程;准备好我司的easyeai-api链接调用;准备好UI的开发环境。具备低模块耦合度的特点。其目的在于方便用户快速拓展自定义的业务功能模块,以及快速更换UI皮肤。 2. 快速上手 2.1 开…...
matlab内置的git软件版本管理功能
1、matlab多人协作开发比普通的嵌入式软件开发困难很多 用过matlab的人都知道,版本管理对于matlab来说真的很费劲,今天介绍的这个工具也不是说它就解决了这个痛点,只是让它变得简单一点。版本管理肯定是不可或缺的,干就完了 2、操作说明 如图所示,源代码管理,选项罗列的…...
【问题排查】SQLite安装失败
启动 Django 自带的开发服务器 python manage.py runserver出现如下报错: [rootiZ2zedudtf2cwzi9argky2Z myproject]# python manage.py runserver Watching for file changes with StatReloader Performing system checks...System check identified no issues (…...
Express中间件(Middleware)详解:从零开始掌握(2)
1. 请求耗时中间件的增强版 问题:原版只能记录到控制台,如何记录到文件? 改进点: 使用process.hrtime()是什么?获取更高精度的时间支持将日志写入文件记录更多信息(IP地址、状态码)工厂函数模式使中间件可配置 con…...
《前端面试题之 CSS篇(第一集)》
目录 1、CSS的盒模型2、CSS选择器及其优先级3、隐藏元素的方法有那些4、px、em、rem的区别及使用场景5、重排、重绘有什么区别6、水平垂直居中的实现7、CSS中可继承与不可继承属性有哪些8、Sass、Less 是什么?为什么要使用他们?9、CSS预处理器/后处理器是…...
MySQL部分总结
mysql学习笔记,如有不足还请指出,谢谢。 外连接,内连接,全连接 外连接:左外、右外 内连接:自己和自己连接 全连接:左外连接右外链接 mysql unique字段 unique可以在数据库层面避免插入相同…...
2025第十六届蓝桥杯PythonB组部分题解
一、攻击次数 题目描述 小蓝操控三个英雄攻击敌人,敌人初始血量2025: 第一个英雄每回合固定攻击5点第二个英雄奇数回合攻击15点,偶数回合攻击2点第三个英雄根据回合数除以3的余数攻击:余1攻2点,余2攻10点࿰…...
RocketMQ 中的 MessageStore 组件:消息存储的核心枢纽
引言 在现代分布式系统中,消息队列扮演着至关重要的角色,它能够实现系统间的异步通信、解耦服务以及削峰填谷等功能。RocketMQ 作为一款高性能、高可靠的分布式消息队列,在众多企业级应用中得到了广泛的应用。而在 RocketMQ 的架构体系里&am…...
Linux Kernel 2
地址空间(Address Space) 一、物理地址空间(Physical Address Space) 物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。 举例:在典型的 32 32 32 位 Intel 架构中, RAM(…...
AndroidTV D贝桌面-v3.2.5-[支持文件传输]
AndroidTV D贝桌面 链接:https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D贝桌面-v3.2.5[支持文件传输] 第一次使用的话,壁纸默认去掉的,不需要按遥控器上键,自己更换壁纸即可...
线性方程组的解法
文章目录 线性方程组的解法认识一些基本的矩阵函数MATLAB 实现机电工程学院教学函数构造1.高斯消元法2.列主元消去法3. L U LU LU分解法 线性方程组的解法 看到以下线性方程组的一般形式:设有以下的 n n n阶线性方程组: A x b \mathbf{Ax}\mathbf{b} A…...
轻量级锁是什么?轻在哪里?重量级锁是什么?重在哪里?
轻量级锁 vs 重量级锁:核心区别与设计哲学 在JVM的锁优化体系中,轻量级锁和重量级锁是两种不同竞争强度下的解决方案。它们的核心差异体现在 资源消耗、适用场景和实现机制 上。以下是详细对比: 一、轻量级锁(Thin Lockÿ…...
Python赋能量子计算:算法创新与应用拓展
量子计算与Python结合的算法开发与应用研究 摘要 量子计算作为计算机科学的前沿技术,凭借其独特的计算能力在解决复杂问题方面展现出巨大潜力。Python作为一种高效、灵活的编程语言,为量子计算算法的开发提供了强大的支持。本文从研究学者的视角,系统探讨了量子计算与Pytho…...
Java学习笔记(多线程):ReentrantLock 源码分析
本文是自己的学习笔记,主要参考资料如下 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的具…...
【LeetCode 热题100】二叉树构造题精讲:前序 + 中序建树 有序数组构造 BST(力扣105 / 108)(Go语言版)
🌱 二叉树构造题精讲:前序 中序建树 & 有序数组构造 BST 本文围绕二叉树的两类构造类题目展开解析: 从前序与中序遍历序列构造二叉树 将有序数组转换为二叉搜索树 我们将从「已知遍历构造树」和「平衡构造 BST」两个角度,拆…...
【软考系统架构设计师】系统配置与性能评价知识点
1、 常见的性能指标 主频外频*倍频 主频1/CPU时钟周期 CPI(Clock Per Instruction)平均每条指令的平均时间周期数 IPC(Instruction Per Clock)每时钟周期运行指令数 MIPS百万条指令每秒 MFLOPS百万个浮点操作每秒 字长影响运算的…...
【android bluetooth 协议分析 01】【HCI 层介绍 1】【hci_packets.pdl 介绍】
在 AOSP 的蓝牙协议栈 (Gabeldorsche) 中,hci_packets.pdl 是一个 协议描述语言文件,用于定义 HCI (Host Controller Interface) 层的数据包结构和通信协议。以下是详细解析: 1. 文件作用 system/gd/hci/hci_packets.pdl 协议自动化生成&…...
低资源需求的大模型训练项目---调研0.5B大语言模型
一、主流0.5B大语言模型及性能对比 1. Qwen系列(阿里) • Qwen2.5-0.5B:阿里2024年9月开源的通义千问系列最小尺寸模型,支持32K上下文长度和8K生成长度。在中文场景下表现优异,指令跟踪、JSON结构化输出能力突出&…...
Spring Boot 中集成 Disruptor_高性能事件处理框架
1. 引言 1.1 什么是 Disruptor Disruptor 是一个高性能的事件处理框架,广泛应用于金融交易系统、日志记录、消息队列等领域。它通过无锁机制和环形缓冲区(Ring Buffer)实现高效的事件处理,具有极低的延迟和高吞吐量的特点。 1.2 为什么使用 Disruptor 高性能:通过无锁机…...
解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南
AI生图自由!就来 ChatTools (https://chat.chattools.cn),畅享Midjourney免费无限绘画。同时体验GPT-4o、Claude 3.7 Sonnet、DeepSeek等强大模型。 为了帮助大家更好地驾驭Midjourney,我们精心整理并分类了大量常用且效果出众的提示词。无论…...
Vue3.5 + Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类
Vue3.5 Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类型 一、完整依赖安装 npm install --save-dev stylelint stylelint-config-standard postcss-html # 解析 Vue/HTML 文件中的样式postcss-scss …...
大模型分布式推理和量化部署
一、小常识 1、计算大模型占用多少显存 对于一个7B(70亿)参数的模型,每个参数使用16位浮点数(等于 2个 Byte)表示,则模型的权重大小约为: 7010^9 parameters2 Bytes/parameter=14GB 70亿个参数每个参数占用2个字节=14GB 所以我们需要大于14GB的显存。注意14GB单纯是大…...
Ubuntu 下通过 Docker 部署 WordPress 服务器
最近想恢复写私人博客的习惯,准备搭建一个wordpress。 在这篇博客中,我将记录如何在 Ubuntu 环境下通过 Docker 部署一个 WordPress 服务器。WordPress 是一个流行的内容管理系统(CMS),它让用户能够轻松地创建和管理网…...
【ROS】分布式通信架构
【ROS】分布式通信架构 前言环境要求主机设置(Master)从机设置(Slave)主机与从机通信测试本文示例启动ROS智能车激光雷达节点本地计算机配置与订阅 前言 在使用 ROS 时,我们常常会遇到某些设备计算能力不足的情况。例…...
零基础HTML·笔记(持续更新…)
基础认知 HTML标签的结构 <strong>文字变粗</strong> <开始标签>内容<结束标签> 结构说明: 标签由<、>、1、英文单词或字母组成。并且把标签中<>包括起来的英文单词或字母称为标签名。常…...
Visual Studio 2022 UI机器学习训练模块
VS你还是太超标了,现在机器学习都不用写代码了吗!! 右键项目解决方案,选择机器学习模型...
Day5:关于MySQL的数据操作——插入数据
使用INSERT语句,其基本语法格式如下: INSERT [ IGNORE ] [ INTO ] 表名( 字段名称1 [ , 字段名称2 … ] ) VALUES ( { 表达式1 | DEFAULT } [ , { 表达式2 | DEFAULT } … ] ); IGNORE:当插入不符合数据完整性约束的数据时…...
FreeRTOS使任务处于阻塞态的API
在FreeRTOS中,任务进入阻塞状态通常是因为等待某个事件或资源。以下是常用的使任务进入阻塞态的API及其分类: 1. 任务延时 vTaskDelay(pdMS_TO_TICKS(ms)) 将任务阻塞固定时间(相对延时,从调用时开始计算)。 示例&…...
阿里云负载均衡可以抗ddos吗
本文深度解析阿里云负载均衡的DDoS防护机制,通过实测数据验证其基础防御能力边界,揭示需结合云盾高防IP实现TB级流量清洗的工程实践。结合2023年Memcached反射攻击事件,提供混合云架构下的多层级防御方案设计指南。 云原生负载均衡的基础防护…...
