Appearance
先通过代码查看当前程序堆的大小,分析默认堆大小和最大可分配内存大小是多少,和当前系统有什么关系,最后再讲解如何自定义堆内存大小。
查看当前堆大小
默认堆大小越为内存/64
,最大可分配内存约为内存/4
java
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");
}
输出结果如下,由于部分内存会被系统消耗(网络服务、系统服务等),因此不是很准确:
markdown
当前堆初始内存大小-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
设置完成后继续运行上述代码,同样由于部分内存会被系统消耗,因此不是很准确
markdown
当前初始内存大小-Xms:491M
当前最大内存大小-Xmx:910M
操作系统物理内存已用的空间为:3320 MB
操作系统物理内存的空闲空间为:12847 MB
操作系统总物理内存:16167 MB
默认堆初始内存大小:物理电脑内存大小/ 64= 200M
默认堆最大内存大小:物理电脑内存大小/ 4= 3211M