首页 > 其他分享 >JVM虚拟机系统性学习-JVM调优之GC日志分析

JVM虚拟机系统性学习-JVM调优之GC日志分析

时间:2023-12-22 12:02:41浏览次数:37  
标签:虚拟机 调优 GC 内存 JVM 日志 垃圾

JVM 调优

首先,为什么要 JVM 调优呢?

JVM 调优的目的就是为了让应用程序使用最小的硬件消耗来承载更大的吞吐量

JVM虚拟机系统性学习-JVM调优之GC日志分析_调优

什么情况下需要 JVM 调优呢?

  1. 系统吞吐量下降,或系统延迟较高
  2. 出现 OOM
  3. Full GC 频繁
  4. GC 停顿时间过长(超过 1s,已经影响用户体验)

调优主要调什么?

JVM 调优主要是两方面:内存分配垃圾回收,大多数情况下是不需要进行 JVM 调优的,JVM 调优是不得已的手段,如果要对系统进行优化,则优先对系统架构和代码进行优化!

  1. 合理的设置堆内存
  2. GC 高效回收占用内存的垃圾对象
  3. JVM虚拟机系统性学习-JVM调优之GC日志分析_调优_02

JVM 调优步骤:

  1. 分析 GC 日志
  2. 判断系统 GC 频率、GC 耗时
  3. 调整参数

GC 日志分析

JVM 中常用参数设置:

-Xms 堆内存最小值
-Xmx 堆内存最大值
-Xmn 新生代内存的最大值
-Xss 每个线程的栈内存


首先通过设置 VM Options 来打开 GC 日志的打印,开启 GC 日志参数设置如下:

# 开启 GC 日志创建更详细的 GC 日志
 -XX:+PrintGCDetails 
 # 开启 GC 时间提示
-XX:+PrintGCTimeStamps,-XX:+PrintGCDateStamps
# 打印堆的GC日志
-XX:+PrintHeapAtGC 
# 指定GC日志路径
-Xloggc:./logs/gc.log


Young GC 日志

2023-06-18T14:31:11.340+0800: 2.340: [GC (Allocation Failure) [PSYoungGen: 896512K->41519K(1045504K)]
896512K-41543K(3435008K), 0.0931965 secs] [Times: user=0.14 sys=0.02, real=0.10 secs]

# GC 日志参数解释
2023-06-18T14:31:11.340+0800 # GC 开始的时间,+0800 代表中国所在的东区
2.340 # GC 事件开始时间相对于 JVM 开始启动的间隔秒数
GC # 区分 Young GC 和 Full GC 的标志,GC 代表 Young GC
(Allocation Failure) # 触发 GC 原因
PSYoungGen # 垃圾回收器的名称
896512K->41519K # 垃圾收集前后新生代的内存使用量由 896512K 变为 41519K
(1045504K) # 新生代内存总大小
896512K-41543K # 垃圾收集前后,整个堆内存使用量由 896512K 变为 41543K
(3435008K) # 堆空间的总大小
0.0931965 secs # GC 持续时间
user=0.14 # GC 线程消耗 CPU 时间为 0.14
sys=0.02 # GC 过程中操作系统调用和系统等待事件所消耗的事件为 0.02
real=0.10 secs # 应用程序暂停的事件为 0.10



Full GC 日志

2021-05-19T14:46:07.367+0800: 1.562: [Full GC (Metadata GC Threshold)[PSYoungGen: 18640K-
>0K(1835008K)] [ParOldGen: 16K->18327K(1538048K)] 18656K->18327K(3373056K), [Metaspace: 20401K-
>20398K(1069056K)], 0.0624559 secs] [Times: user=0.19 sys=0.00, real=0.06 secs]

2021-05-19T14:46:07.367+0800 # GC 开始的时间,+0800 代表中国所在的东区
1.562 # GC 事件开始时间相对于 JVM 开始启动的间隔秒数
Full GC # 区分 Young GC 和 Full GC 的标志
(Metadata GC Threshold) # 触发 GC 原因
PSYoungGen # 垃圾回收器的名称
18640K->0K(1835008K) # 垃圾收集前后新生代的内存使用量由 18640K 变为 0K,新生代内存总大小为 1835008K
ParOldGen # 老年代垃圾收集器名称
16K->18327K(1538048K) # 垃圾收集前后老年代的内存使用量由 16K 变为 18327K,老年代内存总大小为 1538048K
18656K->18327K # 垃圾收集前后,整个堆内存使用量由 896512K 变为 41543K
(3373056K) # 堆总空间大小 
Metaspace # 元空间区域垃圾收集器是 Metaspace
20401K->20398K(1069056K) # 垃圾收集前后元空间的内存使用量由 20401K 变为 20398K,元空间总大小为 1069056K
0.0624559 secs # GC 持续时间
user=0.19 # GC 线程消耗 CPU 时间为 0.19
sys=0.00 # GC 过程中操作系统调用和系统等待事件所消耗的事件为 0.00
real=0.06 secs # 应用程序暂停的事件为 0.06


标签:虚拟机,调优,GC,内存,JVM,日志,垃圾
From: https://blog.51cto.com/u_16186397/8934015

相关文章

  • Java JVM面试题
    我分析了上百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!小伙伴们可以对照着网站里面的文章学习或者准备面试。网站的内容会继续完善,欢迎你在评论区说出你遇到的高频面试题!林老师带你学编程(「Java学习+面试指南」是一份涵盖大部分Java程序员所需要掌握的核心知识......
  • 1. JVM
    JVMJVM(JavaVirtualMachine)是一种能够执行Java字节码的虚拟机,是实现Java跨平台特性的核心部分,他屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行JDK、JRE与JVMJDK(JavaDevelopmentKit):Java......
  • JVM基础篇(三)-JVM结构-运行时数据区之栈帧
    栈帧栈帧的内部结构每个栈帧中存储着:局部变量表(LocalVariables)操作数栈(operandStack)(或表达式栈)动态链接(DynamicLinking)(或指向运行时常量池的方法引用)方法返回地址(ReturnAddress)(或方法正常退出或者异常退出的定义)一些附加信息并行每个线程下的栈都是私有的,因此每个线程都有自己各......
  • java中对于jvm虚拟机进程的操作类
    在java中,Runtime类表示运行时操作类,是一个封装了JVM进程的类,每一个JVM都对应着一个Runtime类的实例,此实例由JVM运行时为其实例化。下面图示演示了其方法以及应用。......
  • JVM实战-G1参数调优
    G1简介G1GC,全称Garbage-FirstGarbageCollector,在JDK1.7中引入了G1GC,从JAVA9开始,G1GC是默认的GC算法。通过-XX:+UseG1GC参数来启用。G1收集器有分区概念,是工作在堆内不同分区上的收集器。G1的分区既可以是年轻代也可以是老年代,同一个代的分区不需要连续。G1收集器在运行过......
  • JVM内存参数的学习之三
    JVM内存参数的学习之三背景研究启动性能时,顺便看到了jmap-heap1的部分信息看到:MinHeapFreeRatio、MaxHeapFreeRatio自己突然以为是Percentage的参数,恍惚了好久.才发现自己对内存的学习不够,所以想多学习一下.参数解释MinHeapFreeRatio:空闲堆空间的最小......
  • nginx调优-调大rlimit_nofile
    前言对于Linux用户或用户组打开的进程,Linux系统会对进程可占用的资源进行限制。该限制针对特定Linux用户或用户组,限制范围是该Linux用户或用户组打开的所有进程。遇到的异常nginx转发的流量比较大。因此在nginx.conf中,存在如下配置:worker_rlimit_nofile131072;event{......
  • JVM虚拟机系统性学习-JVM相关工具jps、jstat、jinfo、jmap、jhat和jstack
    JVM相关工具JDK工具包jps查看Java进程jps:列出Java程序进程ID和Main函数名称jps-q:只输出进程IDjps-m:输出传递给Java进程(主函数)的参数jps-l:输出主函数的完整路径jps-v:显示传递给Java虚拟机的参数jstat查看Java程序运行时相关信息,可以查看运行时堆的相关情况jstat......
  • 记录一次两台电脑vmware中的虚拟机互相访问学习经过
    装过VMware的都知道,VMware有四种网络选择,桥接,主机,和nat,平时都是会使用vmnet8作为网络。因为桥接会使用和宿主机同一个网络,估计会在路由器中注册自己的ip地址。nat模式是网关和dhcp服务交给了虚拟的一个VMnet8网卡,网卡接口为.1出现在宿主机路由表,.2的网关,dhcp随机找一个网段和范围,......
  • JVM垃圾回收机制
    JVM垃圾回收机制JVM垃圾回收机制术语回收机制:在Java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将......