重要的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参数-可用于调整和改善常规应用程序性能。

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

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

 

原文地址:https://blog.csdn.net/allway2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340