【JVM】JVM 调优参数

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【1月更文挑战第27天】【JVM】JVM 调优参数

1.参数分类:

JVM参数主要分为三类:标准参数、X参数、XX参数。

https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html

1.1 标准参数:

标准参数中包括功能以及输出的结果都是很稳定的,基本上不会随着JVM版本的变化发生变化。可以通过-help指令来查看所有的标准参数:

java -help

查看JDK版本信息可以使用-version参数:

java -version
# JDK 版本信息:
openjdk version "1.8.0_352"
# Java 运行时环境信息:
OpenJDK Runtime Environment Corretto-8.352.08.1 (build 1.8.0_352-b08)
# JVM 版本信息:
OpenJDK 64-Bit Server VM Corretto-8.352.08.1 (build 25.352-b08, mixed mode)

1.2 X 参数:

X参数:非标准化参数。表示在将来的JVM版本中可能会发生改变,但是这类以-X开始的参数变化的比较小。

java -X

注意:如果某个参数=0,表示使用默认配置,而不是0

常见使用的-X参数:

  • -Xms初始堆内存,默认是当前计算机物理内存的1/64
-Xms1024m
  • -Xmx最大堆内存,默认是当前计算机物理内存的1/4
-Xmx2048m
  • -Xss设置单个线程栈的大小,一般默认为 512k-1024k
-Xss512k
  • -Xmn设置年轻代大小。堆内存空间固定的情况下,增大年轻代大小,会导致老年代内存大小减少。
-Xmn512m

1.3 XX 参数:

这是我们日常开发中接触到最多的参数类型。这也是非标准化参数,相对来说不稳定,随着JVM版本的变化可能会发生变化,主要用于JVM调优和Debug

  • Boolean类型:
# 表示启用或者禁用name属性:
-XX:[+-]<name>
  • Key-Value类型:
# 表示name的属性值为value:
-XX:<name>=<value>

常见使用的-XX参数:

-XX:MetaspaceSize

设置元空间大小(元空间(Java8才有)的本质和永久代类似,都是对 JVM 规范中的方法区的实现,不过元空间于永久代之间最大区别在于,元空间并不在虚拟中,而是使用本地内存,因此默认情况下,元空间的大小仅受本地内存限制)

元空间默认(21MB)比较小,我们可以调大一点(比如256MB)

-XX:+PrintGCDetails

用于查看详细的 GC 日志信息

设置 JVM 参数为: -Xms10m -Xmx10m -XX:+PrintGCDetails,然后故意使用较大的内存,就可以看到OOM信息以及GC日志信息

常用配置:

控制台部分GC日志:

YGC日志信息解读:

FGC日志信息解读:

-XX:SurvivorRatio

设置新生代中 eden 和 S0/S1 空间比例

默认 -XX:SurvivorRatio=8,Eden : S0 : S1 = 8 : 1 : 1

-XX:NewRatio

配置新生代和老年代在堆中的占比

默认 -XX:NewRatio=2 新生代占1,老年代占2,新生代占整个堆的 1/3

-XX:NewRatio=4 新生代占1,老年代占4

-XX:MaxTenuringThreshold

设置垃圾最大年龄,默认15,最大也是15

-XX:MaxDirectMemorySize

最大直接内存,即本地内存,一般默认是本机物理内存的1/4,其实就是最大堆内存

常见的OOM错误

java.lang.StackOverflowError

产生原因:在一个函数中调用自己就会产生这个错误

java.lang.OutOfMemoryError : Java heap space

产生原因:new 一个很大对象

java.lang.OutOfMemoryError : GC overhead limit exceeded

产生原因:执行垃圾收集的时间比例太大, 有效的运算量太小,默认情况下,,如果GC花费的时间超过 98%, 并且GC回收的内存少于 2%, JVM就会抛出这个错误。

java.lang.OutOfMemoryError : Direct buffer memory

产生原因:直接/堆外内存满了,和GC无关(GC不会管堆外内存),可能是直接分配堆外内存的程序导致的

java.lang.OutOfMemoryError : unable to create new native thread

这个问题经常问,因为和高并发、多线程有关

产生原因:一个进程创建线程太多了,Linux系统默认单个进程创建的最大线程数是1024个

java.lang.OutOfMemoryError : Metaspace

产生原因:元空间满了,元空间用的本地内存

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
10天前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
15天前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
20天前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
36 3
|
20天前
|
Java Android开发 开发者
【编程进阶知识】精细调控:掌握Eclipse JVM参数配置的艺术
本文详细介绍了如何在Eclipse中配置JVM参数,包括内存的初始和最大值设置。通过具体步骤和截图演示,帮助开发者掌握JVM参数的精细调控,以适应不同的开发和测试需求。
35 1
|
21天前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
17天前
|
Java
JVM进阶调优系列(5)CMS回收器通俗演义一文讲透FullGC
本文介绍了JVM中CMS垃圾回收器对Full GC的优化,包括Stop the world的影响、Full GC触发条件、GC过程的四个阶段(初始标记、并发标记、重新标记、并发清理)及并发清理期间的Concurrent mode failure处理,并简述了GC roots的概念及其在GC中的作用。
|
22天前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
20天前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
32 4
|
20天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
44 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS