这些常见的JVM参数配置你都了解吗?

在这篇文章中,我们将一起看一下,一些常见的Java虚拟机的参数配置。

堆内存 - Xms 和 Xmx配置

堆内存配置,可以说是应用程序中,最常见的提升性能的参数配置。

这就是为什么我们需要指定最大和最小堆内存配置:

-Xms<heap size>[unit] 
-Xmx<heap size>[unit]

在这里,unit 表示要初始化内存(用堆大小表示)的单元。 单位可以标记为“ g”代表 GB,“ m”代表 MB,“ k”代表 KB。

例如,如果我们想给 JVM 分配最小的2gb 和最大的5gb,我们需要写:

-Xms2G -Xmx5G

从 java8开始,Metaspace 的大小没有定义。 一旦它达到全局限制,JVM 会自动增加它,然而,为了克服任何不必要的不稳定性,我们可以设置 Metaspace 大小为:

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

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

根据 Oracle 的参考指南,除了总的可用内存之外,第二大影响因素是为年轻代保留的堆的比例。 默认情况下,YG(年轻代) 的最小大小为1310 MB,最大大小不受限制。

我们也可以显示的设置年轻代的大小:

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

垃圾收集

为了提高应用程序的稳定性,选择正确的垃圾收集算法至关重要。有四种类型的 GC 实现:

  • Serial Garbage Collector 串行垃圾收集器
  • Parallel Garbage Collector 并行垃圾收集器
  • CMS Garbage Collector CMS垃圾收集器
  • G1 Garbage Collector G1垃圾收集器

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

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

GC 日志

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

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

-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=< number of log files > 
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log

在这里,UseGCLogFileRotation 指定日志文件滚动策略,很像 log4j、 sl4j 等。 NumberOfGCLogfFles 表示可以为单个应用程序生命周期编写的日志文件的最大数量。 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

但是,问题是总是在后台使用一个附加的守护进程来监视系统时间。 这种行为可能会造成一些性能瓶颈; 这就是为什么在生产中最好不要使用这个参数的原因。

OOM的处理

对于大型应用程序来说,遇到OOM是非常常见的,OOM会导致应用程序崩溃。 这是一个非常关键的场景,很难复制以解决问题。

这就是为什么 JVM 提供了一些参数,这些参数将堆内存转储到一个物理文件中,以后可以用来查找内存泄漏:

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=./java_pid<pid>.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >" 
-XX:+UseGCOverheadLimit

这里有几点需要注意:

HeapDumpOnOutOfMemoryError: 这个参数表示如果发生OOM,则指示 JVM 将 heap 转储到物理文件

HeapDumpPath: 这个参数表示要写入文件的路径, 文件名任意; 但是,如果 JVM 在名称中找到一个 pid 标记,导致内存不足错误的当前进程的进程 id 将会以Hprof 格式附加到文件名中

OnOutOfMemoryError: 这个参数用于发出紧急命令,以便在内存不足的情况下执行; 在 cmd args 中应使用适当的命令。 例如,如果我们想在内存不足时重启服务器,我们可以设置参数:

-XX:OnOutOfMemoryError="shutdown -r"

UseGCOverheadLimit: 该参数是一种策略,它限制在抛出 OutOfMemory 错误之前,在 GC 中花费的 VM 时间的比例

32/64位

在同时安装了32位和64位包的操作系统环境中,JVM 会自动选择32位环境包。如果我们想手动设置环境为64位,我们可以使用下面的参数:

-d<OS bit>

Misc(其他一些参数)

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

在这篇简短的文章中,我们了解了一些重要的 JVM 参数,这些参数可用于调优和提高应用程序性能,其中一些还可以用于调试。

文源网络,仅供学习之用,如有侵权,联系删除。

我将面试题和答案都整理成了PDF文档,还有一套学习资料,涵盖Java虚拟机、spring框架、Java线程、数据结构、设计模式等等,但不仅限于此。

关注公众号【java圈子】获取资料,还有优质文章每日送达。

file
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354