[Java/JVM/堆内存模型] 基于Java的内存资源分析

概述:基于 Java 的内存资源分析

JVM 内存模型

JVM 堆区的重要配置参数

image

-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 推荐文献

X 参考文献

posted @ 2018-07-07 17:27  千千寰宇  阅读(688)  评论(0)    收藏  举报