持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
前一章节介绍了常用的四种垃圾收集器,相信大家都已经有了不少的了解。下面我们来看看如何进行GC调优呢?绝大多数情况下,我们使用默认的配置就能使应用很好地运行了。
堆空间大小
一般的java程序员应该都知道的GC调优方式:调整堆的大小。
其实关于堆大小的调整是一个针对应用程序的权衡过程:
-
堆过小:GC频繁,浪费很多时间,相对而言,处理业务的时间就会减少。
-
堆过大:单次GC时间就会增长,虽然频率降低,但是整体应用的响应就会变慢。
虚拟内存:目前的操作系统都允许将一部分硬盘空间作为虚拟内存,存储一些不常用的内容。但是作用在jvm当中可能会发生严重的性能问题。jvm是不知道这部分是否是虚拟内存,分配给它多少,它就会使用多少,然后通过磁盘向内存这个数据转换的过程将会导致严重的性能问题。
所以,堆内存不能设置超过机器的物理内存,然而实际是需要保留一部分的内存用于机器本身或者其他应用。
常见的堆空间调优参数如下:
# 堆默认空间大小
-Xms
# 堆最大空间
-Xmx
使用如下:
java -jar -Xms256m -Xmx256m xxxx.jar
如果我们不设置堆空间大小,jvm在不同的平台是有其默认值的,我们只关注64位的机器下的默认值:
| 操作系统 | 初始堆Xms | 最大堆Xmx |
|---|---|---|
| 64位linux | 取512M或物理内存的1/64的最小值 | 取32g和物理内存1/4的最小值 |
| 64位Mac OS | 64M | 取1g或物理内存1/4的最小值 |
| 64位Windows | 64M | 取1g或物理内存1/4的最小值 |
为什么要有最小值和最大值?
初始运行,jvm会使用最小值,如果发现频繁发生GC,则会不断地增大堆内存空间,直到达到最大值。
如果你的应用频繁的发生Full GC,那么就要考虑适当的增加堆的最大值。在机器物理内存允许的情况下,按经验来说,每次full gc后,释放至少70%空间就可以。
如果能够明确知道堆空间合适的大小,将Xms和Xmx设置成一样的值,能够微小地提升jvm的性能,因为jvm不需要去计算当前最合适的堆空间大小。