程序员Java 杂谈互联网科技

JVM内存调优:GC 优化+HotSpot VM 参数

2019-05-08  本文已影响12人  a13ed6c7cc5e

JVM 调优概述

JVM内存调优:GC 优化+HotSpot VM 参数

性能定义

JVM内存调优:GC 优化+HotSpot VM 参数

调优原则

GC 优化的两个目标:

  1. 将进入老年代的对象数量降到最低
  2. 减少 Full GC 的执行时间

GC 优化的基本原则是:将不同的 GC 参数应用到两个及以上的服务器上然后比较它们的性能,然后将那些被证明可以提高性能或减少 GC 执行时间的参数应用于最终的工作服务器上。

降低 Full GC 的时间

Full GC 的执行时间比 Minor GC 要长很多,因此,如果在 Full GC 上花费过多的时间(超过 1s),将可能出现超时错误。

因此,你需要把老年代的大小设置成一个“合适”的值

GC 优化需要考虑的 JVM 参数

JVM内存调优:GC 优化+HotSpot VM 参数

有些人可能会问如何设置永久代内存大小,你可以用-XX:PermSize和-XX:MaxPermSize参数来进行设置,但是要记住,只有当出现OutOfMemoryError错误时你才需要去设置永久代内存。

GC 优化的过程

监控 GC 状态

你需要监控 GC 从而检查系统中运行的 GC 的各种状态

分析监控结果后决定是否需要优化 GC

在检查 GC 状态后,你需要分析监控结构并决定是否需要进行 GC 优化。如果分析结果显示运行 GC 的时间只有 0.1-0.3 秒,那么就不需要把时间浪费在 GC 优化上,但如果运行 GC 的时间达到 1-3 秒,甚至大于 10 秒,那么 GC 优化将是很有必要的。

如果你已经分配了大约 10GB 内存给 Java,并且这些内存无法省下,那么就无法进行 GC 优化了。在进行 GC 优化之前,你需要考虑为什么你需要分配这么大的内存空间,如果你分配了 1GB 或 2GB 大小的内存并且出现了OutOfMemoryError,那你就应该执行堆快照(heap dump)来消除导致异常的原因。

堆快照(heap dump)是一个用来检查 Java 内存中的对象和数据的内存文件。该文件可以通过执行 JDK 中的jmap命令来创建。在创建文件的过程中,所有 Java 程序都将暂停,因此,不要在系统执行过程中创建该文件。

设置 GC 类型/内存大小

如果你决定要进行 GC 优化,那么你需要选择一个 GC 类型并且为它设置内存大小。此时如果你有多个服务器,请如上文提到的那样,在每台机器上设置不同的 GC 参数并分析它们的区别。

分析结果

在设置完 GC 参数后就可以开始收集数据,请在收集至少 24 小时后再进行结果分析。如果你足够幸运,你可能会找到系统的最佳 GC 参数。如若不然,你还需要分析输出日志并检查分配的内存,然后需要通过不断调整 GC 类型/内存大小来找到系统的最佳参数。

HotSpot VM 参数

JVM 内存配置

JVM内存调优:GC 优化+HotSpot VM 参数

GC 类型配置

JVM内存调优:GC 优化+HotSpot VM 参数

辅助配置

JVM内存调优:GC 优化+HotSpot VM 参数

典型配置

堆大小设置

年轻代的设置很关键。

JVM 中最大堆大小有三方面限制:

  1. 相关操作系统的数据模型(32-bt 还是 64-bit)限制;
  2. 系统的可用虚拟内存限制;
  3. 系统的可用物理内存限制。

整个堆大小 = 年轻代大小 + 年老代大小 + 持久代大小

本文到此就结束了!喜欢的朋友可以帮忙转发下文章和关注下我,持续分享更多的干货,感谢支持!

上一篇 下一篇

猜你喜欢

热点阅读