JDK8 JVM 简单堆分配实验

时间:2021-03-04 15:09:56

实验环境

JDK8
Eclipse Neon.1a Release (4.6.1)

实验问题

在进行新生代的from和to空间分配的配置时

发现分配的空间大小不对。

实验内容

jvm参数

-Xmx20m -Xms20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails

程序

连续申请10次1M内存空间,总计10M

实验结果

报错如下

[GC (Allocation Failure) [PSYoungGen: 509K->480K(1024K)] 509K->536K(19968K), 0.0005949 secs] [Times: user=0.08 sys=0.02, real=0.00 secs]
Heap PSYoungGen total 1024K, used 747K
eden space 512K, 47% used
from space 512K, 98% used
to space 512K, 0% used
ParOldGen
total 18944K, used 10248K
object space 18944K, 54% used
Metaspace
used 2587K, capacity 4486K, committed 4864K, reserved 1056768K class
space used 287K, capacity 386K, committed 512K, reserved 1048576K
Java HotSpot(TM) 64-Bit Server VM warning: NewSize (1536k) is greater than the MaxNewSize (1024k). A new max generation size of 1536k will be used.

问题

(1) 明显的eden空间和from/to 空间的比例不为2,与参数不符
(2) 老年代空间使用为10248K,新生代使用空间为747K;总计申请10240K空间。

猜想

(1)问题1会不会与虚拟机底层的最小分配单位有关
(2)问题2应该 是程序的其他资源占用一部分空间

解决

(1)将新生代空间增大 为2m -Xmn2m
from 和to 的比例正常
(2)不申请任何空间时,eden占用819k(疑为Java程序其他占用)
只申请1M空间。发现eden 空间内占用1843K。