重要的JVM参数指南

1.概述

在本快速教程中,我们将探索可用于配置Java虚拟机的最著名的选项。

2.显式堆内存– XmsXmx选项

与性能有关的最常见实践之一是根据应用程序要求初始化堆内存。

这就是为什么我们应该指定最小和最大堆大小。以下参数可用于实现此目的:

-Xms<heap size>[unit]

-Xmx<heap size>[unit]

在此,单位表示要初始化内存(由堆大小指示)的单位。单位可以标记为GB的“ g”,MB的“ m”和KB的“ k”

例如,如果我们要为JVM分配最小2 GB和最大5 GB,我们需要编写:

-Xms2G -Xmx5G

从Java 8开始,未定义Metaspace的大小。一旦达到全局限制,JVM会自动增加它。但是,为了克服任何不必要的不​​稳定,我们可以使用以下方法设置元空间大小:

-XX:MaxMetaspaceSize=<metaspace size>[unit]

在这里,metaspace size表示我们要分配给Metaspace的内存量。

根据Oracle准则,在总可用内存之后,第二大影响因素是为Young Generation保留的堆的比例。默认情况下,YG的最小大小为1310 MB,最大大小为无限制

我们可以明确地分配它们:

-XX:NewSize=<young size>[unit]

-XX:MaxNewSize=<young size>[unit]

3.垃圾收集

为了提高应用程序的稳定性,选择正确的垃圾收集算法至关重要。

JVM具有四种类型的GC实现:

  • 串行垃圾收集器
  • 并行垃圾收集器
  • CMS垃圾收集器
  • G1垃圾收集器

可以使用以下参数声明这些实现:

-XX:+UseSerialGC

-XX:+UseParallelGC

-XX:+USeParNewGC

-XX:+UseG1GC

有关垃圾回收实施的更多详细信息,请参见此处

4. GC记录

为了严格监控应用程序的运行状况,我们应该始终检查JVM的垃圾回收性能。最简单的方法是以人类可读的格式记录GC活动。

使用以下参数,我们可以记录GC活动:

-XX:+UseGCLogFileRotation

-XX:NumberOfGCLogFiles=< number of log files >

-XX:GCLogFileSize=< file size >[ unit ]

-Xloggc:/path/to/gc.log

UseGCLogFileRotation指定日志文件滚动的政策,就像log4j的,s4lj等NumberOfGCLogFiles表示的,可以为单个应用程序生命周期被写入日志文件的最大数量。GCLogFileSize指定文件的最大大小。最后, loggc表示其位置。

这里要注意的是,还有两个可用的JVM参数(-XX:+ PrintGCTimeStamps-XX:+ PrintGCDateStamps)可用于在GC日志中打印按日期标记的时间戳。

例如,如果我们要分配最多100个GC日志文件,每个文件的最大大小为50 MB,并希望将它们存储在' / home / user / log /'位置,则可以使用以下语法:

-XX:+UseGCLogFileRotation 

-XX:NumberOfGCLogFiles=10

-XX:GCLogFileSize=50M

-Xloggc:/home/user/log/gc.log

但是,问题在于,总是在后台使用一个附加的守护程序线程来监视系统时间。此行为可能会产生一些性能瓶颈;因此,在生产中最好不要使用此参数。

5.处理内存不足

大型应用程序遇到内存不足错误非常普遍,而错误又导致应用程序崩溃。这是非常关键的情况,很难复制以解决问题。

这就是JVM带有一些参数的原因,这些参数将堆内存转储到物理文件中,以后可用于查找泄漏:

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./java_pid<pid>.hprof

-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"

-XX:+UseGCOverheadLimit

这里有几点要注意:

  • HeapDumpOnOutOfMemoryError指示JVM在OutOfMemoryError情况下将堆转储到物理文件中
  • HeapDumpPath表示要写入文件的路径;可以提供任何文件名;但是,如果JVM在名称中找到<pid>标记,则会将导致内存不足错误的当前进程的进程ID附加到.hprof格式的文件名中。
  • OnOutOfMemoryError用于发出紧急命令以在出现内存不足错误时执行;在cmd args的空格中应使用正确的命令。例如,如果要在内存不足时立即重新启动服务器,则可以设置参数:

-XX:OnOutOfMemoryError="shutdown -r"

  • UseGCOverheadLimit是一项策略,用于限制在抛出OutOfMemory错误之前,VM在GC中花费的时间比例

6. 32/64

在同时安装了32位和64位软件包的OS环境中,JVM会自动选择32位环境软件包。

如果要手动将环境设置为64位,可以使用以下参数进行设置:

-d<OS bit>

OS位可以是3264。有关此的更多信息,请参见此处

7.其他

  • -server:启用“服务器热点VM”;默认情况下,此参数在64位JVM中使用
  • -XX:+ UseStringDeduplication Java 8u20引入了此JVM参数,以通过创建太多相同String的实例来减少不必要的内存使用这通过将重复的String值减少为单个全局char []数组来优化堆内存
  • -XX:+ UseLWPSynchronization:设置基于LWP轻量级进程)的同步策略,而不是基于线程的同步
  • -XX:LargePageSizeInBytes设置用于Java堆的大页面大小;它采用GB / MB / KB作为参数;页面大小较大时,我们可以更好地利用虚拟内存硬件资源;但是,这可能会导致PermGen的空间更大,从而迫使其减小Java堆空间的大小。
  • -XX:MaxHeapFreeRatio:设置GC之后为避免收缩而释放的最大堆百分比。
  • -XX:MinHeapFreeRatio:设置GC之后为避免扩展而可用的最小堆百分比;要监视堆使用情况,可以使用JDK附带的VisualVM
  • -XX:SurvivorRatio伊甸园/幸存者空间大小之比–例如, -XX:SurvivorRatio = 6将每个幸存者空间伊甸园空间之比设置为1:6,
  • -XX:+ UseLargePages:如果系统支持,则使用大页面内存;请注意,如果使用此JVM参数, OpenJDK 7倾向于崩溃
  • -XX:+ UseStringCache启用对字符串池中可用的常用分配的字符串的缓存
  • -XX:+ UseCompressedStrings:对可使用纯ASCII格式表示的String对象使用byte []类型
  • -XX:+ OptimizeStringConcat尽可能优化String串联操作

8.结论

在这篇简短的文章中,我们了解了一些重要的JVM参数-可用于调整和改善常规应用程序性能。

其中一些也可以用于调试目的。

如果您想更详细地探索参考参数,可以从这里开始。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值