1、分配机制
JVM分为client 端和server端,默认情况下32位的hotspot都是client模式;64位的默认都是server模式。(所以我们现在基本都是64位模式进行的)
参考资料:https://blog.csdn.net/qq_26545305/article/details/70241939
hotspot虚拟机的默认堆大小如果未指定,他们是根据服务器物理内存计算而来的
client模式下,JVM初始和最大堆大小为:
在物理内存达到192MB之前,JVM最大堆大小为物理内存的一半,否则,在物理内存大于192MB,在到达1GB之前,JVM最大堆大小为物理内存的1/4,大于1GB的物理内存也按1GB计算,举个例子,如果你的电脑内存是128MB,那么最大堆大小就是64MB,如果你的物理内存大于或等于1GB,那么最大堆大小为256MB。
Java初始堆大小是物理内存的1/64,但最小是8MB。
server模式下(常用):
与client模式类似,区别就是默认值可以更大,比如在32位JVM下,如果物理内存在4G或更高,最大堆大小可以提升至1GB,,如果是在64位JVM下,如果物理内存在128GB或更高,最大堆大小可以提升至32GB。
2、具体测试
我现在有一个如下服务器,64264M,
[hadoop@node06-cuidong zgh]$ free -m
total used free shared buff/cache available
Mem: 64264 25343 353 120 38567 38129
Swap: 0 0 0
然后我启动一个简单的springboot项目
[hadoop@node06-cuidong zgh]$ java -jar ceshi-0.0.1-SNAPSHOT.jar
然后 jps -l 找到相关的pid,然后通过jmap -heap 来查看最大堆内存与初始堆内存的情况
jmap -heap 7133
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 16848519168 (16068.0MB)
NewSize = 351272960 (335.0MB)
MaxNewSize = 5616173056 (5356.0MB)
OldSize = 703594496 (671.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
由上面可以发现,最大堆内存为16068M,为服务器总内存的4分之一。初始化内存为NewSize+OldSize 为1006M 为总内存的64分之一。均吻合
我尝试着在更小服务器上测试这些,发现得到的数据是相同的。占比情况一样。
网友评论