[Java/JVM/堆内存模型] 基于Java的内存资源分析
概述:基于 Java 的内存资源分析
JVM 内存模型
JVM 堆区的重要配置参数

-Xms :初始堆大小(默认物理内存1/64);-Xmx :最大堆大小(默认物理内存1/4).。
-Xss:表示每个线程栈的大小。
-Xmn:表示新生代(年轻代)的大小
-XX:NewRatio:默认为2,表示新生代占年老代的1/2,占整个堆内存的1/3。
-XX:SurvivorRatio:默认为8,表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。
-XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 只受限于本地内存大小。
-XX:MetaspaceSize: 指定元空间触发Full Gc的初始阈值(元空间无固定初始大小), 以字节为单位。
查看设置JVM内存信息
Runtime.getRuntime().maxMemory(): 返回JVM从操作系统那里挖到的最大内存,如果内存本身没有限制,则返回值 Long.MAX_VALUE,以字节为单位 (对应-Xmx)
默认值为物理内存的1/4,设值不能高于计算机物理内存
Runtime.getRuntime().freeMemory(): 返回JVM的空闲内存量,供将来分配对象使用的当前可用内存的近似总量,以字节为单位。 (与-Xms有关联关系)
freeMemory(): 为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,而 JVM 实际可用内存并不等于freeMemory(),而应该等于maxMemory()-totalMemory()+freeMemory()
Runtime.getRuntime().totalMemory(): 用于获取 Java 虚拟机(JVM)当前已经从操作系统那里分配的内存总量。其值相当于当前JVM已使用的内存及freeMemory()的总和
最佳实践
IDE: Eclipse 等
- Eclipse下 Run as configration
Arguments选项:
-Xmx80m【设置虚拟机JVM最大开辟内存为80Mbyte】
一般JVM内存限制是64Mbyte
ApplicationMemoryStatus
- ApplicationMemoryStatus - Github/knowdata
import lombok.ToString;
/**
* @version v1.0
* @update-time 2025/08/15 09:01
* @description 应用程序的内存状态
*/
@ToString
public class ApplicationMemoryStatus {
/** unit : byte **/
private Long totalSize;
/** unit : byte **/
private Long freeSize;
/** unit : byte **/
private Long maxSize;
/** 使用率; unit : % **/
private Double usageRate;
/**
* 采集此时此刻的内存状态信息
*/
public static ApplicationMemoryStatus collect(){
ApplicationMemoryStatus memoryStatus = new ApplicationMemoryStatus();
Runtime runtime = Runtime.getRuntime();
memoryStatus.setFreeSize(runtime.freeMemory());//返回JVM的空闲内存量,供将来分配对象使用的当前可用内存的近似总量,以字节为单位。 (与 `-Xms`有关联关系)
memoryStatus.setTotalSize(runtime.totalMemory());//用于获取 Java 虚拟机(JVM)当前已经从操作系统那里分配的内存总量
memoryStatus.setMaxSize(runtime.maxMemory());//返回JVM从操作系统那里挖到的最大内存,如果内存本身没有限制,则返回值 Long.MAX_VALUE,以字节为单位 (与 `-Xmx`有关联关系)
Double usageRate = Double.valueOf( (( 1.0d * memoryStatus.totalSize - memoryStatus.freeSize ) / memoryStatus.totalSize)*100 );
memoryStatus.setUsageRate( usageRate );
return memoryStatus;
}
public static void main(String[] args) {
ApplicationMemoryStatus memoryEnvironmentStatus = ApplicationMemoryStatus.collect();
System.out.println(memoryEnvironmentStatus.toStringAsMb());
}
@Override
public String toString() {
return "ApplicationMemoryStatus{" +
"totalSize=" + totalSize + "byte" +
", freeSize=" + freeSize + "byte" +
", maxSize=" + maxSize + "byte" +
", usageRate=" + usageRate + "%" +
'}';
}
public String toStringAsMb() {
return "ApplicationMemoryStatus{" +
"totalSize=" + (totalSize/1024/1024) + "mb" +
", freeSize=" + (freeSize/1024/1024) + "mb" +
", maxSize=" + (maxSize/1024/1024) + "mb" +
", usageRate=" + usageRate + "%" +
'}';
}
public Long getTotalSize() {
return totalSize;
}
public void setTotalSize(Long totalSize) {
this.totalSize = totalSize;
}
public Long getFreeSize() {
return freeSize;
}
public void setFreeSize(Long freeSize) {
this.freeSize = freeSize;
}
public Long getMaxSize() {
return maxSize;
}
public void setMaxSize(Long maxSize) {
this.maxSize = maxSize;
}
public Double getUsageRate() {
return usageRate;
}
public void setUsageRate(Double usageRate) {
this.usageRate = usageRate;
}
}
- 分析
物理机器节点: 16 c, 64gb
- case 1(应用程序Pod)
程序启动 -DcloudMessageLocalPath="classpath:/can/cloud-message/CAN_MESSAGE.bin" -Xms2048M -Xmx4096M
内存资源 ApplicationMemoryStatus{totalSize=2048mb, freeSize=2024mb, maxSize=4096mb, usageRate=1.1568769812583923%}
- case 2(应用程序Pod)
程序启动 -DcloudMessageLocalPath="classpath:/can/cloud-message/CAN_MESSAGE.bin" -Xms512M -Xmx512M
内存资源 ApplicationMemoryStatus{totalSize=512mb, freeSize=412mb, maxSize=512mb, usageRate=0.0%}
Y 推荐文献
- [JVM] Java Heap Dump 分析 - 博客园/千千寰宇
- 深入浅出JVM:Java虚拟机的探秘之旅 - CSDN
- http://docs.sun.com/source/819-0084/pt_tuningjava.html
X 参考文献
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

浙公网安备 33010602011771号