【JVM】内存分析工具JConsole/Visual VM

news2024/11/24 3:52:38

1 缘起

日常补充JVM调优,调优实践前需要学习一些理论做支撑,
JVM调优三步:理论=>GC分析=>JVM调优,
我们会有一些玩笑话说,做了这么久Java开发,做过JVM调优吗?
做过,面试时。当然,不同职业阶段有不同的需求,面试中有面试的需求,工作中有工作需求,
面试时是必背需求,工作中是可选需求,我们维护稳定的系统时,自然不需要JVM调优,
当我们需要为新业务构建新系统或者业务发展调整系统时,为保证系统稳定运行,就需要JVM参数配置以及调优了。

调优方案,是依据当前系统资源以及业务实际情况最终确定的:减少Full GC频率。
(1)硬件资源尚有可用,可直接增加年轻代和老年代堆内存,减少Full GC频率;
(2)硬件资源不足(原因不论),调整年轻代内存分配,减少Full GC频率,依据当前业务场景,计算每次请求占用的内存,做限流处理;
(3)硬件资源不足,业务逻辑中有冗余数据生成,去除冗余数据或者调整业务需求,如减少单次数据生成量,减少Full GC频率。
请添加图片描述

2 一些理论基础

JVM自带内存回收,设计者将JVM运行时数据区的堆进一步进行划分,
一方面可以高效使用内存,另一方面灵活配置内存,适应不同的场景。
JDK8中的JVM运行时数据区堆分为老年代和年轻代,结构如下图所示:
所以我们调整的堆大小就是新生代的Eden区和老年代,
不同区的内存回收有不同的术语,如Minor GC、Major GC和Full GC。

  • Minor GC:针对年轻代Eden区内存回收。当新生成的对象在Eden区无法正常分配时,会触发Minor GC,并将Eden区仍存活的对象拷贝到Survivor区,当From Survivor区达到年龄阈值的对象超过From或To Survivor空间一半时,会将这部分对象分配到老年代。
  • Major GC:针对老年代内存回收。当Eden区存活的对象进入老年代或者Eden区无法分配的对象直接进入老年代,而老年代没有足够内存分配,发生Major GC。
  • Full GC:针对年轻代和老年代内存回收。当老年代空间不足(直接进入老年代的新建对象)、YGC对象晋升失败(Survivor对象达到年龄设定值,进入老年代,老年代没有足够空间分配)、YGC晋升到老年代对象平均总大小大于老年代空闲空间时发生Full GC。

Full GC对整个JVM运行时数据区影响最大,不同的垃圾回收器有不同表现,如Serial垃圾回收器会发生STW(Stop The World),导致内存回收期间服务不可用,服务处于离线状态。

  • 最终结论:最大限度减少Full GC频率,保证服务在线时间。

在这里插入图片描述

2 JVM运行时数据区:堆 观测工具

有了上面的理论基础,我们可以正确阅读【堆】运行状态以及当前JVM运行状态。
查看当前服务JVM运行时数据区堆的运行状况有多种方式,如查看GC日志、JConsole、Visula VM等工具。
本文就介绍如何使用JConsole和Visual VM查看JVM运行时数据区堆实时状态。

2.1 JConsole

JConsole是JDK提供的原生工具,安装JDK后,通过命令行即可开启JConsole,以Windows为例,
控制台输入:jconsole

在这里插入图片描述
默认的JConsole用户界面如下,有两种连接Java进程的方式,
直接连接本地Java进程或者通过IP和Port连接远程Java进程,本文演示连接本地Java进程。
在这里插入图片描述

2.1.1 老年代

连接本地Java进程后,菜单栏有概览、内存、线程、类等,我们分析JVM运行时数据区堆的使用情况,
因此查看内存菜单下信息。
通过切换图标标签,可查看不同分代的状态,如老年代。
通过老年代GC频率可以直观看出系统的稳定性,老年代GC频率高,系统不稳定性高,老年代GC频率与系统稳定性反比关系或者老年代GC频率与系统不稳定性正比关系。
这里查看老年代内存回收情况,老年代GC即曲线下降时发生,
通过老年代GC我们可以推测此时发生了Major GC或者Full GC,此时JVM运行时数据区堆老年代已无足够内存供系统使用,
老年代GC曲线拐点出现频次即发生Major GC或Full GC的频次,如果下图的波峰在单位时间(分钟或小时)内出现多次,说明系统稳定性夏下降了,需要关注系统运行情况,并进一步排查什么原因引发Major GC或Full GC的。

在这里插入图片描述

2.1.2 年轻代:Eden区

年轻代Eden区GC曲线如下图所示,
通过Eden区内存回收情况可以了解当前年轻代健康状况,
单位时间内Eden区回收次数较多(依实际情况而定),说明当前系统Eden区分配较小或者当前业务系统的对象朝生夕死的大对象较多,需要即时调整年轻代Eden区大小,减少Minor GC频率。
下面模拟的情况就是Eden区分配的内存较小,Minor GC频率高达:7次/分钟,这里配置的年轻代10MB,
为验证使用,年轻代内存分配不足,需要增加年轻代内存。

在这里插入图片描述

2.1.3 Survivor区

新生代Eden区发生GC时,最先受到影响的时Survivor区,
当Eden区内存回收时,即Mnior GC,会将存活的对象复制到Survivor From(S0)区,对象年龄+1,
再次发生Minor GC时,会将Eden区和Survivor From区区存活的对象复制到Survivor To(S1)区,
S0和S1区在发生Minor GC时依次轮转,保证MinorGC后存活的对象分配连续的内存,避免内存碎片化,
当Survivor From/To区对象达到预设的年龄或者对象超过Survivor From/To区域一半时,将这部分对象会晋升到老年代。
因此,Survivor区GC频率从侧面说明了进入老年代对象的频率,
频率越高,说明年轻代分配的内存不足或者当前业务系统对象生成逻辑存在需要优化的情况。

在这里插入图片描述

2.2 Visual VM

Visual VM是另一个GC可视化工具,原先是JDK的内置工具,但是从谋个JDK版本之后,Visual VM已从JDK中移除,需要单独下载使用。

在这里插入图片描述
Visual VM地址:https://visualvm.github.io

在这里插入图片描述

下载后,可执行文件:

在这里插入图片描述
Visual VM如何观测JVM的GC情况呢?当然有工具,Visual GC插件即可观测。
(1)安装Visula GC插件
在这里插入图片描述

在这里插入图片描述

(2)使用Visual GC插件
安装Visual GC插件后重启Visual GC,检测Java进程,通过Visual GC菜单栏即可观测当前Java进程的GC情况,
实际采集的结果如下图所示,Visual GC插件将JVM运行时数据区堆部分整合在一起方便查看。
这里分析与上面JConsole一致,不赘述。
如果想要更好的GC观测体验,推荐Visual GC。

在这里插入图片描述

3 小结

(1)Minor GC发生条件:Eden区被对象占满时发生,回收Eden区内存,将存活的对象复制到Survivor From(S0)区,再次发生Minor GC时,将存活的对象以及S0的对象复制到S1区,如此往复,S0与S1轮转,当S0/S1区对象满足(占用50%或者对象达到年龄阈值时)晋升到老年代:
(1.1)Eden区存活的对象大于S0或S1区50%时,直接进入老年代,不进入S0或S1区;
(1.2)S0/S1区的存活的对象超过50%,对象晋升到老年代;
(1.3)S0/S1区存活的对象年龄超过指定阈值(默认15)时,对象晋升到老年代。
(2)Major GC发生条件:老年代内存被占满时,回收老年代内存。
(3)Full GC发生条件:老年代空间不足分配新对象、YGC担保失败、YGC晋升到老年代对象平均大小大于老年代空闲空间或者显式调用System.gc,回收年轻到和老年代内存。
调优方案,是依据当前系统资源以及业务实际情况最终确定的:减少Full GC频率。
(1)硬件资源尚有可用,可直接增加年轻代和老年代堆内存,减少Full GC频率;
(2)硬件资源不足(原因不论),调整年轻代内存分配,减少Full GC频率,依据当前业务场景,计算每次请求占用的内存,做限流处理;
(3)硬件资源不足,业务逻辑中有冗余数据生成,去除冗余数据或者调整业务需求,如减少单次数据生成量,减少Full GC频率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】yolov8n模型的剪枝操作记录

原始 剪枝微调后 可以看到模型大小了, 测试结果显示再cpu 上加速5%-10% from ultralytics import YOLOimport time # Load a pretrained YOLO11n model count_num 500 def test1():model YOLO("/home/justin/Desktop/code/v8_prun/runs/detect/train3/weig…

LC刷题专题:记忆化搜索

文章目录 576. 出界的路径数 本刷题专栏记录自己的记忆化搜索的做题。 576. 出界的路径数 题目链接及描述: https://leetcode.cn/problems/out-of-boundary-paths/description/ 第一次看到这个题目可能先入为主了,首先想到的是使用动态规划做&#xff…

19.安卓逆向-frida基础-hook分析调试技巧1-hookMD5

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

C#多线程基本使用和探讨

线程是并发编程的基础概念之一。在现代应用程序中,我们通常需要执行多个任务并行处理,以提高性能。C# 提供了多种并发编程工具,如Thread、Task、异步编程和Parallel等。 Thread 类 Thread 类是最基本的线程实现方法。使用Thread类&#xff0…

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值 [NOIP2013 普及组] 表达式求值题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2输入 #3输出 #3 提示 1.简单做法1.1.题意解析1.2.AC代码 2.使用栈的做法2.1.题意解析2.2.AC代码 [NOIP2013 普及组…

C高级--shell脚本实现分支判断

题目: 分支结构结合test指令完成一下编程 1>判断闰年 2>输入一个数判断是否为偶数 3>使用test指令实现等级判断 90--100A 60--89B 0-50C 其他错误 代码如下: #!/bin/bash read -p "请输入一个年份:" year if [ $((y…

Cisco Meraki平台登陆

登陆以下网址 https://n4.meraki.cn/ 输入之前注册的邮箱,点击Next 输入之前注册时输入的密码,注意不是企业邮箱的密码! 查看邮箱,将验证码输入,点击Verify(验证),此验证码10分…

C语言-文件IO

文件IO I :input 输入,从文件中读取数据到内存 O:output 输出,把数据写入到文件 Linux系统IO 和 c语言标准IO 1、linux系统IO 1.1 简介 linux操作系统把对文件的操作封装成了多个函数,统称为linux系统IO。 文件描述符(File descirptor)…

笔试算法day01

目录 1.除2 2.Fibonacci数列&#xff08;Fib 数列&#xff09; 3.单词搜索 1.除2 除2&#xff01; (nowcoder.com) 算法思路&#xff1a; 只需要对最大的n个偶数进行/2即可。 将所有的偶数存进大根堆中&#xff0c;执行k次操作即可 #include <iostream> #include <…

2024年AI知识库哪家强?8款主流软件对比分析

在当今这个信息爆炸的时代&#xff0c;如何高效地管理、搜索和共享知识成为了一个重要的问题。AI知识库作为一种先进的解决方案&#xff0c;正受到越来越多企业和个人的青睐。本文将对比分析8款主流的AI知识库软件&#xff0c;帮助大家找到最适合自己的工具。 1. HelpLook AI知…

机器学习K近邻算法——回归问题K近邻算法示例

针对“数据4.1”&#xff0c;讲解回归问题的K近邻算法&#xff0c;以V1&#xff08;营业利润水平&#xff09;为响应变量&#xff0c;以V2&#xff08;固定资产投资&#xff09;、V3&#xff08;平均职工人数&#xff09;、V4&#xff08;研究开发支出&#xff09;为特征变量。…

Flutter 进阶:根据IP地址判断用户国家/地区

在应用开发中根据IP地址判断用户国家/地区的两种方法 引言 在开发国际化应用时&#xff0c;了解用户的地理位置至关重要。这不仅影响用户体验&#xff0c;还关系到内容展示和合规性。本文将介绍两种通过IP地址判断用户所在国家或地区的方法。 方法一&#xff1a;使用 ip-api…

redis高级(面试题二)

目录 一、redis的五大数据结构有哪些&#xff1f;zset底层是什么结构&#xff1f; 1、redis五大数据结构有哪些&#xff1f; 2、什么是skiplist&#xff1f; 3、zset底层是什么结构&#xff1f; 二、Redis的内存过期策略是什么&#xff1f;Redis的内存淘汰策略有哪些&#…

【专题】数据库系统的基本原理

1. 数据库系统概述 1.1. 数据库系统的应用 电信业、银行业、金融业、销售业、联机的零售商、大学、航空业、人力资源、制造业等等。 1.2 数据库系统的概念 (1) 数据&#xff08;Data&#xff09; 数据是数据库存储的基本对象。是描述现实世界中各种具体事物或抽象概念的、可…

Nuxt日志监控(服务端及客户端日志检测)

此文章主要讲解如何使用Nuxt进行日志监控&#xff0c;例如服务端请求日志&#xff0c;客户端请求日志&#xff0c;方便线上出现问题能及时排查问题所在 一、下载依赖 npm install winston winston-daily-rotate-file二、plugin下创建日志处理插件winston.js&#xff0c;对日志…

靠谱!有了它,微信自动统计报表轻松搞定!

当你需要定期统计多个微信号的数据时&#xff0c;每次都要逐一登录并手动统计各种数据&#xff0c;这不仅耗时&#xff0c;还容易出错。 好在&#xff0c;一个便捷的工具——个微管理系统能够帮助我们高效地管理这些繁杂的数据&#xff0c;让我们的工作事半功倍。 好友统计报…

安装Node.js环境,安装vue工具(最佳实践)

一、安装Node.js 去官网下载自己需求的安装包&#xff08;我提供的步骤是windows10 64x&#xff09; 下载 | Node.js 中文网 (nodejs.cn)https://nodejs.cn/download/ 下载好后&#xff0c;安装到默认路径就好了&#xff0c;所占用的内容很少。 一直点next就行了 安装好后&a…

python操作.docx、.pptx文件

python操作.docx、.pptx文件 .docx文件和.pptx文件是Microsoft Office套件中两种常见的文件格式&#xff0c;分别对应Word文档和PowerPoint演示文稿。WPS Office完美支持Microsoft Office文件格式。 使用 Python 操作 .docx 和 .pptx 文件是一项非常实用的技能&#xff0c;尤…

BlabkForestLabs 又放大招:“蓝莓”模型其实是 Flux1.1?!

神秘的 AI 生成模型 BlabkForestLabs 又放大招了&#xff1f;就在 AI 绘画圈还在训练 Flux.1 练的不亦乐乎的时候&#xff0c;黑森林工作室又推出了一个新的模型—— Flux1.1 &#xff01;这次升级后的 Flux1.1 性能直接完爆前版的 Flux.1 &#xff0c;再次将 AI 绘画的上限拉高…

如何给ppt增加新的一页?这2个ppt使用技巧值得推荐!

在当今讲究视觉表现力的时代&#xff0c;PPT已经成为职场中不可或缺的工具。无论是汇报工作、演示方案还是传递想法&#xff0c;一份精美的PPT都能让你的演讲&#xff08;演示&#xff09;更加出色。 然而&#xff0c;制作PPT并非易事&#xff0c;尤其是对于新手来说&#xff…