JVM 堆内存查看
JVM 堆内存查看的方式有多中,可以用命令也可以用工具(jconsole等),这里我来说下如何使用命令查看。
PrintFlagsFinal
$ java -XX:+PrintFlagsFinal -version |grep -E 'HeapSize|PerSize|ThreadStackSize'
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 268435456 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 4294967296 {product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
我们可用看到最大堆内存为4294967296字节,转换为4Gb,我们的电脑初始化堆内存为268435456字节,转换为250Mb
PrintCommandLineFlags
$ java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
查询出来的结果和上面我们看到的是一样的
JVM默认堆内存大小
如果不进行设置,Jvm会给我们设置一个默认的堆内存大小,我们先来看下oracle官方给出的文档
Initial Heap Size and Maximum Heap Size Changed for Parallel Garbage Collector
On server-class machines running either VM (client or server) with the parallel garbage collector (-XX:+UseParallelGC) the initial heap size and maximum heap size have changed as follows.
initial heap size
Larger of 1/64th of the machine's physical memory on the machine or some reasonable minimum. Before Java SE 5.0, the default initial heap size was a reasonable minimum, which varies by platform. You can override this default using the -Xms command-line option.
maximum heap size
Smaller of 1/4th of the physical memory or 1GB. Before Java SE 5.0, the default maximum heap size was 64MB. You can override this default using the -Xmx command-line option.
Note: The boundaries and fractions given for the heap size are correct for Java SE 5.0. They are likely to be different in subsequent releases as computers get more powerful.
翻译过来大概就是,初始的堆内存大小为物理内存的1/64的较大值或者某个合理的最小值;最大堆内存小于物理内存的1/4或者1GB。需要注意的是,这些这是jdk 1.5之后的默认值。