美文网首页
JVM进程启动的内存分配问题

JVM进程启动的内存分配问题

作者: 早点起床晒太阳 | 来源:发表于2020-05-06 11:13 被阅读0次

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分之一。均吻合

我尝试着在更小服务器上测试这些,发现得到的数据是相同的。占比情况一样。

相关文章

  • JVM进程启动的内存分配问题

    1、分配机制 JVM分为client 端和server端,默认情况下32位的hotspot都是client模式;6...

  • 一个可以提升JVM运行性能的参数

    JAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是...

  • JVM的内存模型

    1. 概述 我们运行一个Java程序时,操作系统会相应启动一个JVM进程,同时为这个进程分配一块内存。在这一块内存...

  • 回顾JVM内存分配

    回顾JVM内存分配回顾JVM内存分配

  • 内存分配策略

    详解JVM对象分配内存 对象的内存分分配主要是指对上分配(也可栈上分配),对象主要分配在新生代Eden区,如果启动...

  • 41 jvm内存结构分析

    jvm内存区域分配java 堆是各线程共享的内存区域,在jvm启动时创建,这块区域是jvm中最大的用于存储应用的对...

  • JVM对并发分配内存处理方式

    内存分配部分 为对象分配内存的基本方法:指针碰撞法、空闲列表法 内存分配并发问题的解决:CAS、TLAB JVM对...

  • JVM参数

    一、堆内存分配: JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定...

  • 不可不知的 JVM 预热

    一、JVM 架构基础 JVM 进程启动时,ClassLoader 会将需要的所有类加载到内存,主要分为以下三步: ...

  • tomcat8.5修改默认jvm内存参数&解决shutdown关

    修改tomcat8.5默认jvm内存参数 1.查看java进程jvm参数 结果发现默认启动时,并没有配置jvm参数...

网友评论

      本文标题:JVM进程启动的内存分配问题

      本文链接:https://www.haomeiwen.com/subject/dzmightx.html