网站首页 > 技术文章 正文
概述
在这篇文章中,我们将一起看一下,一些常见的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 参数,这些参数可用于调优和提高应用程序性能,其中一些还可以用于调试。
猜你喜欢
- 2024-10-28 美团面试:熟悉哪些JVM调优参数,幸好我准备过
- 2024-10-28 Java虚拟机:Jvm概念和原理详解以及GC机制的分析
- 2024-10-28 JVM 的内存模型(jvm1.8内存模型)
- 2024-10-28 JDK、JRE、JVM,是什么关系?(jdk jrejvm的区别)
- 2024-10-28 一个 JVM 参数引发的频繁 CMS GC(当产生一个异常时,jvm会做什么)
- 2024-10-28 JVM系列一:JVM内存组成及分配(jvm的内存分配)
- 2024-10-28 谈谈JMM与JVM的相关知识(jmm jvm juc)
- 2024-10-28 一份详细介绍JVM的资料(对比JDK8和JDK7)
- 2024-10-28 理解JVM运行时数据区域,看这一篇文章就够了
- 2024-10-28 2万字!JVM核心知识总结(jvm基础知识)
- 最近发表
-
- 如何在 Linux 上安装 Java_怎么在linux中安装jdk
- Linux中tar命令打包路径相关问题_linux怎么用tar打包一个目录
- 常用linux系统常用扫描命令汇总_常用linux系统常用扫描命令汇总表
- VM下linux虚拟机新建过程(有图)_linux虚拟机创建新用户命令
- 系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
- 文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
- 如何利用ftrace精确跟踪特定进程调度信息
- prometheus网络监控之fping-exporter
- hyper linux的实操步骤,hyper-v批量管理工具的使用指南
- 2021年,运维工程师笔试真题(二)(附带答案)
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)