Java基础知识28--JVM参数调优 -Xms -Xmx -Xmn -Xss

1.jvm性能调优的最基本条件

首先我们要知道,垃圾回收器(GC)在回收内存空间时候,所有的工作线程都会暂停,待回收工作完成后,工作线程才会继续运行。如果GC太频繁,工作线程的效率和响应时间肯定会受影响,所以,jvm性能调优的最基本条件就是要尽可能地减少垃圾回收的次数。

2. Xms和Xmx参数为什么要设置相同的值

首先来看看Xms和Xmx的作用

  • Xms:堆内存的最小Heap值,默认为物理内存的1/64,但小于1G。默认当空余堆内存大于指定阈值时,JVM会减小heap的大小到-Xms指定的大小。比如我电脑内存是16G,那么默认的Xms就是 16*1024/64=256m
  • Xmx:堆内存的最大Heap值,默认为物理内存的1/4。默认当空余堆内存小于指定阈值时,JVM会增大Heap到-Xmx指定的大小。比如我电脑内存是16G,那么默认的Xmx就是16/4=4G
命名应该非简称,助记的话: memory maximum, memory startup, memory nursery/new,
Xms和Xmx不同值产生的内存抖动

其实Xms和Xmx参数设置成相同的值就是为了防止 内存抖动, 如果将Xms和Xmx参数设置为不同的值,比如将堆内存的初始值设置为256m,将最大值设为 4096m

当项目在运行 过程中,

  • 默认空余堆内存小于40%时,就会进行扩容,注意这里是提前扩容的,不是达到256m的时候才扩容,跟HashMap类似,博主猜测里面应该也是有一个负载因子类似的参数;只要你一直往塞对象,堆内存就会向操作系统申请内存,基本上是要多少就申请多少,一直到达最大内存(Xmx)
  • 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。

 

为什么要防止内存抖动?
上面已经说过,Xms和Xmx参数设置成相同的值就是为了防止 内存抖动,为什么要防止内存抖动呢? 是因为每次jvm向操作系统申请内存时都需要一定的开销,

就比如我上街看到一个很喜欢的商品,想要买下这个商品,但是我身上的钱不够了, 于是我向你借钱,你同意了,然后你掏出钱包, 把钱拿出来,然后再交给我,你拿钱给我的这整个过程也是需要时间的。所以我为了省下这个拿钱的时间,我在一开始出门的时候就直接带上足够的钱,这样就可以省下借钱的时间了;

jvm也一样,在启动项目的时候就直接设置好足够的堆内存大小,避免不够用的时候又要跟操作系统申请;省下了申请内存的开销,就达到了优化的目的。

参考文献:https://blog.csdn.net/javadada1197/article/details/119414239

posted @ 2023-09-28 11:27  雨后观山色  阅读(1645)  评论(0编辑  收藏  举报