堆设置了8G,java进程却占用了12G内存

news/2025/9/30 9:26:09/文章来源:https://www.cnblogs.com/fengjian2016/p/19119977

简单来说,当你的JVM堆内存(Heap)使用了8GB时,整个Java进程实际占用的物理内存(常被称为RSS - Resident Set Size)会远大于8GB。一个合理的估算是在 10GB 到 12GB 之间,甚至可能更高,具体取决于你的应用特性和JVM配置。

下面我们来详细分解这“多出来”的内存究竟用在了哪里。

Java进程的总内存占用可以大致看作是以下几个部分的总和:

总内存 ≈ 堆内存 + 元空间 + 线程栈 + JIT代码缓存 + 直接内存 + GC开销 + JVM自身及其他

 

各部分内存详解

1. 堆内存 (Heap Memory) - 8 GB

这是你通过 -Xmx8g 参数设置的部分,也是最大的一块。它用于存放所有的对象实例和数组。在这个场景下,我们假设它已经用满了,即 8 GB。

2. 元空间 (Metaspace)

用途
存储类的元数据信息,如类名、字段、方法、字节码等。Spring Boot应用由于大量使用动态代理和AOP,元空间占用通常不小。
控制参数
-XX:MaxMetaspaceSize
典型估算 对于一个中大型的Spring Boot应用,元空间占用 256MB 到 512MB 是很常见的。我们按
512 MB 计算。

3. 线程栈 (Thread Stacks)

用途
每个Java线程都有自己的栈,用于存储局部变量、方法调用信息等。
计算方式线程数
* 每个线程的栈大小
控制参数
-Xss (例如 -Xss1m 表示每个线程栈大小为1MB,这是64位Linux下的默认值)。
典型估算 : 一个Web应用在高并发下,线程数可能达到几百个。包括Tomcat的工作线程、GC线程、定时任务线程、以及其他JVM内部线程。 假设你的应用在高负载下有
400 个活跃线程。 总线程栈大小 = 400 * 1MB = 400 MB。

 

4. JIT代码缓存 (JIT Code Cache)

用途
JVM会将热点代码(经常执行的方法)编译成本地机器码(Native Code)来提升性能,这部分机器码就存储在代码缓存区。
控制参数
-XX:ReservedCodeCacheSize (在JDK 8+,默认大小通常是 240 MB)。
典型估算 对于一个长期运行且复杂的应用,这部分基本会被用满,我们按
240 MB 计算。

 

5. 直接内存 (Direct Memory)

用途
这是堆外内存,通过NIO的 ByteBuffer.allocateDirect() 分配。很多高性能框架如Netty、Undertow,以及一些文件IO操作会使用它来避免数据在JVM堆和本地堆之间来回复制,从而提高效率。
控制参数
-XX:MaxDirectMemorySize (默认情况下,它的大小与最大堆内存 -Xmx 相同!)。
典型估算这部分变数最大。如果你的应用没有大量使用NIO,可能只占用几十MB。但如果使用了Undertow作为Web服务器或进行大量文件
/网络操作,可能会占用 几百MB甚至更多。我们保守估算一个中等用量:256 MB。

6. GC开销及JVM内部开销

用途
垃圾回收器自身需要内存来维护数据结构,比如G1垃圾回收器的Card Table、Remembered Sets等,这部分开销可能占堆大小的百分之几。
JVM自身运行也需要一些内存,用于加载so/dll库、维护内部数据结构等。
典型估算 这部分比较难精确计算,但对于一个8GB的堆,估算有
256 MB 到 512 MB 的额外开销是合理的。我们按 512 MB 计算。

 

估算总和

现在,我们把这些部分加起来:

image

 

 结论:从这个保守的计算可以看出,当8GB的堆内存被用满时,Java进程的实际物理内存占用轻松达到 接近10GB。如果你的应用线程数更多,或者使用了大量的直接内存,这个数字达到11GB或12GB是完全正常的

如何实际监控?

在生产环境中,不要只靠估算。你可以使用以下工具来查看Java进程的实际内存占用:

1.Linux/macOS 命令:
top: 查看进程列表,RES 或 RSIZE 列就是进程占用的物理内存。
ps -o pid,rss,vsz -p <PID>: rss 列(Resident Set Size)是关键指标。2.JVM原生内存跟踪 (NMT - Native Memory Tracking):
这是最精确的分析工具。需要在启动时加入JVM参数:-XX:NativeMemoryTracking=summary 或 -XX:NativeMemoryTracking=detail。
然后使用 jcmd 命令来查看报告:

# 查看摘要
jcmd <PID> VM.native_memory summary

# 查看详情
jcmd <PID> VM.native_memory detail

 

总结

在进行容量规划时,绝不能只考虑堆内存。为Java进程分配的容器(如Docker)或虚拟机内存,必须远大于你设置的 -Xmx 值,否则很容易因为堆外内存的使用而被操作系统OOM Killer杀掉。通常的经验法则是:为容器分配的内存 = -Xmx + 1-2GB 的额外空间,对于超大堆,这个额外空间需要更多。

 

摘自:

https://mp.weixin.qq.com/s/4FsNkgxB6WDkP9UTcb9r4g

 

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

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

相关文章

Huxe 推出主动式 AI 音频服务,无感内容消费;OpenAI 推出 ChatGPT Pulse:主动提供个性化信息丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 , 每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术」、「有亮点的产品」、「有思考的文章」、「有…

厦门旅游网站建设目的哈尔滨网站设计哪里有做

什么是数据结构&#xff1f;数据结构是什么&#xff1f;要了解数据结构&#xff0c;我们要先明白数据和结构&#xff0c;数据就是一些int char 这样的变量&#xff0c;这些就是数据&#xff0c;如果你是一个篮球爱好者&#xff0c;那么你的球鞋就是你的数据&#xff0c;结构就是…

C++学习:C++类型转换专栏 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站多域名怎么做北京建机职业技能鉴定中心证书查询

1、 你有几次遇到需要解压 .tar 文件但无法记住所需的确切参数&#xff1f;别名可以帮助你&#xff01;只需将以下内容添加到 .bash_profile 中&#xff0c;然后使用 untar FileName 解压缩任何 .tar 文件。 alias untartar -zxvf 2、 下载文件时&#xff0c;如果出现问题想要…

太原网站建设找山西云起时企业宣传片拍摄思路

小弟多次想把调用门和RPL分开单独说&#xff0c;但几次尝试都没有成功&#xff0c;我发现它们之间是紧偶合、密不可分&#xff0c;RPL的产生主要是为解决系统调用时的“越权”问题&#xff0c;系统调用的实现方式中&#xff0c;以调用门和中断门最为适合。由于以后我们将用中断…

网站不能上传附件ps软件下载中文版免费下载

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…

kubelet源码阅读(三)——kubelet调用device plugin的allocate接口

kubernetes-master/pkg/kubelet/cm/devicemanager/endpoint.go 入参:devs是设备ID 响应:AllocateResponse包含了需要注入到容器中的工作件(envs环境变量、mounts挂在信息、devices设备信息、annotations注解信息、c…

建网站做cpa小影wordpress主题

F1 显示当前程序或者windows的帮助内容。 F2 当你选中一个文件的话&#xff0c;这意味着“重命名” F3 当你在桌面上的时候是打开“查找&#xff1a;所有文件” 对话框 F10或ALT 激活当前程序的菜单栏 windows键或CTRLESC 打开开始菜单 CTRLALTDELETE 在win9x中打开关闭程序对话…

NAFNet (Simple Baselines for Image Restoration) 阅读笔记 - 教程

NAFNet (Simple Baselines for Image Restoration) 阅读笔记 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

有关网站建设的文章京东电子商务网站建设

原理 最小二乘法由勒让德(A.M.Legendre)于1805年在其著作《计算彗星轨道的新方法》中提出,主要思想是最小化误差二次方和寻找数据的最佳匹配函数,利用最小二乘法求解未知参数,使得理论值与观测值之差(即误差,或称为残差)的二次方和达到最小,即: E = ∑ i = 1 n ϵ …

海口的网站建设公司创新的盐城网站开发

引言&#xff1a;编写批处理程序&#xff0c;实现批量删除当前目录及子目录下的空文件夹。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑…

解决OpenWrt系统上出现“git: remote-https is not a git command...”的问题

在OpenWrt上安装git软件包后,执行git clone命令时,出现了下面的报错: git: remote-https is not a git command. See git --help. fatal: remote helper https aborted session 通过AI工具进行,发现原来是没有安装…

密码技术概论

View Post密码技术概论密码技术概论 一、 时代背景:从信息化到智能化技术发展路径:信息化 → 数字化 → 网络化 → 智能化。 核心驱动力:万物互联(IoT)的开启,将一切连接入网。 数字时代特征:数字化:将物理世界…

临猗商城网站建设平台wordpress vantage

shell,perl,python的区别 2012-03-18 10:48:42| 分类&#xff1a; 默认分类 | 标签&#xff1a; |字号大中小 订阅 shellsedawk三者中功能最弱&#xff0c;没有调试程序&#xff0c;大多数操作必须通过运行其他程序才能执行&#xff0c;所以需要更多时间、内存并在进程表中…

国内搜索引擎网站wordpress类似于知更鸟的中文主题

1.我们先创建一个空的大文件夹 2.打开该文件夹的终端 输入npm init -y 2.1.打开该文件夹的终端 2.2在该终端运行 npm init -y 3.安装webpack 3.1打开webpack网址 点击“中文文档” 3.2点击“指南”在点击“起步” 3.3复制基本安装图片画线的代码 4.在一开始的文件夹下在创建一…

合肥建设局网站官网四川全美网络科技有限公司

什么是Istio&#xff1f; 在现代软件开发中&#xff0c;微服务架构已经成为构建可扩展、灵活系统的首选方法。然而&#xff0c;随着微服务数量的增加&#xff0c;服务间的通信、监控和管理变得越来越复杂。为了解决这些问题&#xff0c;服务网格&#xff08;Service Mesh&…

麒麟网站建设wordpress打开文章很慢

游戏开发基础part3--Paint 画笔 Paint画笔是绘图的辅助类&#xff0c;一般它是作为画布的参数来实现相应的效果&#xff0c;Paint类中包含文字与位图的样式、颜色等属性信息。Paint的常用方法如下&#xff1a; 1.setAntiAlias(boolean aa) 作用&#xff1a;设置画笔是否无锯齿 …

网站建设厃金手指花总十一网络营销策划方案的目的

文章目录 1、 新建应用时选择与自己真机匹配的sdk版本2、 根据报错提示连接打开处理方案3、查询真机版本对应的**compileSdkVersion** 和 **compatibleSdkVersion** 提示3.1版本之后和3.1版本之前的不同命令&#xff08;此处为3.0版本&#xff09;4、根据查询修改参数5、连接成…

wap网站开发价钱外包开发一个app多少钱

PLC作为下位机&#xff0c;接收上位机的执行命令&#xff0c;并将执行结果反馈给上位机。工具/原料电脑、PLC、USB转RS232数据线和RS232转RS485模块(或者USB转RS485)方法/步骤PLC与电脑线路连接&#xff0c;根据电脑的串口情况&#xff0c;1.电脑自带RS232串口&#xff0c;那么…