设置jvm内存空间

2023-07-25 jvm

先通过代码查看当前程序堆的大小,分析默认堆大小和最大可分配内存大小是多少,和当前系统有什么关系,最后再讲解如何自定义堆内存大小。

# 查看当前堆大小

默认堆大小越为内存/64,最大可分配内存约为内存/4

import com.sun.management.OperatingSystemMXBean;
import java.lang.management.ManagementFactory;

public static void main(String[] args) {
    int byteToMb = 1024 * 1024;
    Long totalMemory = Runtime.getRuntime().totalMemory() / byteToMb;
    Long maxMemory = Runtime.getRuntime().maxMemory() / byteToMb;
    System.out.println("当前堆初始内存大小-Xms:" + totalMemory + "M");
    System.out.println("当前堆最大内存大小-Xmx:" + maxMemory + "M");
    // 操作系统级内存情况查询
    OperatingSystemMXBean osmxb = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
    Long physicalFree = osmxb.getFreePhysicalMemorySize() / byteToMb;
    Long physicalTotal = osmxb.getTotalPhysicalMemorySize() / byteToMb;
    Long physicalUse = physicalTotal - physicalFree;
    System.out.println("操作系统物理内存已用的空间为: " + physicalFree + " MB");
    System.out.println("操作系统物理内存的空闲空间为: " + physicalUse + " MB");
    System.out.println("操作系统总物理内存:" + physicalTotal + " MB");
    System.out.println("默认堆初始内存大小:物理电脑内存大小 / 64 = " + physicalTotal / 64 + "M");
    System.out.println("默认堆最大内存大小:物理电脑内存大小 / 4 = " + physicalTotal / 4 + "M");
}

输出结果如下,由于部分内存会被系统消耗(网络服务、系统服务等),因此不是很准确:

当前堆初始内存大小-Xms:243M
当前堆最大内存大小-Xmx:3593M
操作系统物理内存已用的空间为:2101 MB
操作系统物理内存的空闲空间为:14066 MB
操作系统总物理内存:16167 MB
默认堆初始内存大小:物理电脑内存大小 / 64 = 252M
默认堆最大内存大小:物理电脑内存大小 / 4 = 4041M

# 自定义堆内存大小

堆的大小在jvm启动时就已经设定好了,可以通过-Xmx-Xms来进行设置,-X是jvm的运行参数。

  • -Xms<size>:堆的初始内存。例如-Xms512m表示将初始堆大小设置为512MB。
  • -Xmx<size>:堆的最大内存。例如-Xmx1024m表示将最大堆大小设置为1024MB。
  • 举例说明:java -Xms512m -Xmx1024m YourClassName

image-20230725174059248

设置完成后继续运行上述代码,同样由于部分内存会被系统消耗,因此不是很准确

当前初始内存大小-Xms:491M
当前最大内存大小-Xmx:910M
操作系统物理内存已用的空间为:3320 MB
操作系统物理内存的空闲空间为:12847 MB
操作系统总物理内存:16167 MB
默认堆初始内存大小:物理电脑内存大小/ 64= 200M
默认堆最大内存大小:物理电脑内存大小/ 4= 3211M

# 读懂GC日

上次更新: 5 个月前