【JVM】深入理解JVM调优

简介: 【JVM】深入理解JVM调优

JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method),主要的调优范围就是堆区的参数调整

1. JVM调优

1.1 JVM调优的主要目的

JVM调优的主要目的:减少GC的频率,通过减少Minor GC和减少Full GC的次数(将进入老年代的对象数量降到最低)来实现

减少GC的频率

什么时候触发Minor GC

  1. 大多数情况下,对象在新生代的Eden区中分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC
  2. 虚拟机在进行minorGC之前会判断老年代最大的可用连续空间是否大于新生代的所有对象总空间,如果大于的话,直接执行minorGC。

什么时候触发Full GC

  1. 老年代空间不足
    如果创建一个大对象,eden区中空间不足,直接保存到老年代中,当老年代空间不足时候,直接触发full gc
  2. 持久代空间不足
    如果持久代中需要调用加载的类,调用的方法很多,同时持久代没有足够的空间,会触发full gc
  3. 统计YGC发生时晋升到老年代的平均总大小大于老年代的空闲空间
  4. 显示调用System.gc()方法
  5. YGC出现promotion failure
    如果Survivor区当中存活对象的年龄达到了设定值,会就将Survivor区当中的对象拷贝到老年代,如果老年代的空间不足,就会发生promotion failure, 接下去就会发生Full GC.

1.2 JVM调优的主要措施

1.2.1 监控GC

如何监控GC?

要想进行JVM调优,首先就是需要进行GC监控,找出影响GC的因素,进行修改

常用工具

java开发人员都知道jdk里的bin里面有java.exe,javac.exe,但是不利到里面还有很多实用的小工具

1.2.1.1 jps:虚拟机进程状况工具

如下图,可以列出正在运行的虚拟机进程,根据参数显示不同的信息

1.2.1.2 jstat:虚拟机统计信息监视工具

监视虚拟机各种运行状态信息的命令行工具,可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据

命令格式

jstat [ option vmid [interval[s|ms] [count] ]  ]

参数interval和count表示查询间隔和次数,option 表示希望查询的虚拟机信息,比如-gc表示监视java堆状况,包括Eden区,两个Survivor区、老年代、永久代等的容量等等

范例

jstat -gc 12176 2000 5   // 查询vmid=12176 ,5次每隔2000ms

两个幸存者区(S0和S1表示Survivor0、Survivor1),老年代(O表示Old),永久代(P表示Permanent),程序运行以来共发生Minor GC 6次 耗时0.109,发生FullGC3次 耗时0.201,所有GC总耗时0.577

在实际生产环境不一定有图形页面,所以使用jstat工具监视虚拟机状态的变化是比较常见的

1.2.1.3 jmap:Java内存映像工具

jmap 用于生成 heap dump 文件。

命令

jmap [option] LVMID复制代码

**堆快照(heap dump)**是一个用来检查 Java 内存中的对象和数据的内存文件。该文件可以通过执行 JDK 中的jmap命令来创建。在创建文件的过程中,所有 Java 程序都将暂停,因此,不要在系统执行过程中创建该文件。

1.2.2 分析

如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化,如果GC时间超过1-3秒,或者频繁GC,则必须优化。

一般情况下满足下面条件不需要进行优化

Minor GC执行时间不到50ms;

Minor GC执行不频繁,约10秒一次;

Full GC执行时间不到1s;

Full GC执行频率频繁,不低于10分钟1次;

1.2.3 调整参数

参数的调整主要有JVM 内存配置、GC 类型配置、辅助配置三种

JVM 内存配置

配置描述-Xms堆空间初始值。-Xmx堆空间最大值。-XX:NewSize新生代空间初始值。-XX:MaxNewSize新生代空间最大值。-Xmn新生代空间大小。-XX:PermSize永久代空间的初始值。-XX:MaxPermSize永久代空间的最大值。

GC 类型配置

配置描述-XX:+UseSerialGC串行垃圾回收器-XX:+UseParallelGC并行垃圾回收器-XX:+UseParNewGC使用 ParNew + Serial Old 垃圾回收器组合-XX:+UseConcMarkSweepGC并发标记扫描垃圾回收器-XX:ParallelCMSThreads=并发标记扫描垃圾回收器 = 为使用的线程数量-XX:+UseG1GCG1 垃圾回收器

辅助配置

配置描述-XX:+PrintGCDetails打印 GC 日志-Xloggc:指定 GC 日志文件名-XX:+HeapDumpOnOutOfMemoryError内存溢出时输出堆快照文件

目录
相关文章
|
1月前
|
算法 Java 关系型数据库
掌握这3个技巧,你也可以秒懂JAVA性能调优和jvm垃圾回收
JVM 是一个虚拟化的操作系统,类似于 Linux 和 Window,只是他被架构在了操作系统上进行接收 class 文件并把 class 翻译成系统识别的机器码进行执行,即 JVM 为我们屏蔽了不同操作系统在底层硬件和操作指令的不同。
34 0
|
1月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
30 0
|
1月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
105 0
|
10天前
|
运维 Java Shell
手工触发Full GC:JVM调优实战指南
本文是关于Java应用性能调优的指南,重点介绍了如何使用`jmap`工具手动触发Full GC。Full GC是对堆内存全面清理的过程,通常在资源紧张时进行以缓解内存压力。文章详细阐述了Full GC的概念,并提供了两种使用`jmap`触发Full GC的方法:通过`-histo:live`选项获取存活对象统计信息,或使用`-dump`选项生成堆转储文件以分析内存状态。同时,文中也提醒注意手动Full GC可能带来的性能开销,建议在生产环境中谨慎操作。
|
1月前
|
设计模式 NoSQL Java
京东面试:如何进行JVM调优?
JVM 调优是一个很大的话题,在回答“如何进行 JVM 调优?”之前,首先我们要回答一个更为关键的问题,那就是,我们为什么要进行 JVM 调优? 只有知道了为什么要进行 JVM 调优之后,你才能准确的回答出来如何进行 JVM 调优? 要进行 JVM 调优无非就是以下两种情况: 1. **目标驱动型的 JVM 调优**,如,我们是为了最短的停顿时间所以要进行 JVM 调优,或者是我们为了最大吞吐量所以要进行 JVM 调优等。 2. **问题驱动型的 JVM 调优**,因为生产环境出现了频繁的 FullGC 了,导致程序执行变慢,所以我们要进行 JVM 调优。 所以,针对不同的 JVM 调
35 1
|
14天前
|
Java 应用服务中间件 Linux
Tomcat 调优及 JVM 参数优化
Tomcat 调优及 JVM 参数优化
|
22天前
|
存储 算法 Java
JVM性能调优:内存模型及垃圾收集算法
JVM性能调优:内存模型及垃圾收集算法
29 0
|
1月前
|
Arthas 人工智能 监控
JVM工作原理与实战(三十五):性能调优
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了性能调优、性能调优案例等内容。
34 1
|
1月前
|
缓存 监控 Java
深入理解Java虚拟机(JVM)性能调优
【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。
|
1月前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【4月更文挑战第17天】本文探讨了JVM性能调优的关键技术,包括内存模型调优(关注堆内存和垃圾回收),选择和优化垃圾收集器,利用JVM诊断工具进行问题定位,以及实战调优案例。强调了开发者应理解JVM原理,善用工具,结合业务场景进行调优,以应对高并发和大数据量的挑战。调优是持续的过程,能提升系统稳定性和效率。