深度剖析JVM调优法则:从两大特性CPU、内存出发轻松掌握调优实战技巧

news2024/12/23 5:08:07

1、JDK自带工具

场景一、CPU过高

CPU占用过高排查思路:(查进程->查线程列表->查线程堆栈)

step1:通过top命令查询占用CPU情况

top 

p.s.shift+p(大写的P-cpu排序) shift+m(大写的M-内存排序)

step2:通过进程pid,查询对应的线程列表

top -Hp pid
  • -H:显示线程信息
  • -p pid1,pid2,...:只显示指定进程的信息

step3:线程id转为十六进制

从step2中可以看到占用cpu较高的线程id,打印出十六进制

printf  '%x\n' id

step4:通过jstack查出线程栈信息

cpu过高主要是线程方面的问题,我们知道jvm中每个线程都分配了单独的栈,我们可以通过jstack查看线程栈情况。

jstack pid

p.s.这里的pid为进程id,也就是第一步top中的pid

对照着step3中占用cpu最高的线程十六进制值可以定位到线程的栈信息。

上图可以看到具体定位到了java的代码,就可以具体分析一下这个java代码为什么会创建大量的线程占用大量的cpu。

除了java程序线程问题,cpu过高也可能是线程死锁造成的,我们通过jstack也可以查看线程死锁的情况。

step5:通过jstack查看情况死锁情况

jstack -l pid

-l:除了线程列表外,还显示关于锁的附加信息

通过栈中的信息可以定位到代码中死锁的代码。

step6:通过jstat查看gc情况

除了以上的各种情况,还有一种就是java频繁的gc也会造成cpu占用过高

jstat -gcutil pid 1000

1000ms为刷新数据的间隔时间

如果有频繁的gc就可以分析堆数据中哪些对象创建的比较多,就可以具体分析了。

场景二、内存占用过高

排查思路: (查进程->jvm内存占用)

step1:通过top命令查询占用CPU情况

top 

p.s.shift+p(大写的P-cpu排序) shift+m(大写的M-内存排序)

step2:通过进程pid查看gc情况

jstat -gcutil pid 1000 

以下是该命令的输出结果说明:

  • S0:表示survivor space 0区域的使用情况,即第1个幸存区的使用情况。
  • S1:表示survivor space 1区域的使用情况,即第2个幸存区的使用情况。
  • E:表示eden space区域的使用情况,即新生代中Eden区的使用情况。
  • O:表示old space区域的使用情况,即老年代中的使用情况。
  • M:表示metaspace区域的使用情况,即元空间中的使用情况。
  • CCS:表示压缩类空间的使用情况。如果JVM启用了类数据共享(CDS)技术并且开启了压缩类指针(Compressed Class Pointer)选项,那么就会存在一个称为“压缩类空间”的特殊区域,用于存放共享的类元数据信息。
  • YGC:表示年轻代垃圾回收的次数。年轻代是JVM中内存分配的主要区域,垃圾回收在此区域较为频繁。
  • YGCT:表示年轻代垃圾回收所花费的时间总和。通常情况下,年轻代垃圾回收所需时间不应过长,否则可能会导致系统响应变慢或出现卡顿现象。
  • FGC:表示Full GC(全局垃圾回收)的次数。Full GC是对整个Java堆进行清理的垃圾回收过程,较为耗时。
  • FGCT:表示Full GC所花费的时间总和。Full GC的执行时间通常比年轻代垃圾回收要长得多,因为它需要处理整个Java堆。
  • GCT:表示所有垃圾回收所花费的时间总和,即YGCT和FGCT的总和。

以上各个区域的使用情况都会以百分比的形式进行显示,即0.0%~100.0%之间。

例如,如果输出结果为“40.00 20.00 60.00 70.00 100.00”,则表示:

  • survivor space 0的使用率为40.00%
  • survivor space 1的使用率为20.00%
  • eden space的使用率为60.00%
  • old space的使用率为70.00%
  • metaspace的使用率为100.00%

step3:通过jmap查看堆情况

通过step2已经发现jvm中的数据过多,频繁的ygc并且大量的数据都在老年代没有回收,这样就会表现出内存占用过高。下一步就是分析那些对象占用了内存。

jmap -histo pid

jmap -histo命令可以用于输出Java堆内存中各个对象类型及其数量的统计信息。具体说明如下:

  • num 参数代表要分析的Java进程中的对象编号
  • instances:表示Java堆内存中对象的数量
  • bytes:表示Java堆内存中对象占用的总字节数。
  • class name:表示Java堆内存中对象所属类名。

可以看到org.example.User创建的比较多。这相就可以具体分析一下代码中哪些地方创建了User为什么没被回收。

与jmap -histo类似的命令:

#jmap -dump
jmap -dump:format=b,file=heapdump.hprof pid

jmap -dump命令可以用于生成Java进程的内存快照文件(.hprof格式),以便进行后续的分析和调试。具体说明如下:

  • filepath:表示生成的内存快照文件路径。该文件可以通过Java虚拟机诊断工具(例如VisualVM、Eclipse Memory Analyzer等)进行分析和调试。
  • pid:表示要生成内存快照的Java进程的进程ID。

导出的快照文件可以通过jvisualvm或mat来查看:

  • jvisualvm

  • mat

mat还比较智能,直接把存在问题的给你列出来

step4:jmap -heap jvm内存实际占用情况

除了以上内存占用情况,在java项目中还存在一种情况。比如我java项目没有配置jvm参数都使用默认的配置,我服务器64G内存。会发现用一段时间后java进程占用了8G内存。这时你可以使用命令看看java实际使用的内存情况,然后再调整jvm参数。

jmap -heap是一个用于获取Java堆内存信息的命令行工具,它可以输出Java虚拟机中堆内存的使用情况和配置信息。

=========================================

如果文章对你有帮助,不要忘记加个关注、点个赞!

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

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

相关文章

调试Dynaslam: Ubuntu系统下使用VS Code进行自动化调试Dynaslam的教程,包括tasks.json和launch.json的配置

调试Dynaslam: Ubuntu系统下使用VS Code进行自动化调试Dynaslam的教程,包括tasks.json和launch.json的配置 修改CMakeLists.txt文件 将SET(CMAKE_BUILD_TYPE Release)修改为SET(CMAKE_BUILD_TYPE Debug)不开启编译优化,在编译选项中包含 -g 参数来启用…

springboot+vue冬奥会科普平台(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的冬奥会科普平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌…

探索iOS之多摄像头预览架构

在iOS13.0开始支持多摄像头预览AVCaptureMultiCamSession,然后iOS15.0增加支持摄像头画中画预览。在使用之前,我们通过isMultiCamSupported()判断是否支持多Camera同时预览。 一、Camera架构 1、Camera流水线 Camera由AVCaptureDeviceInput、AVCaptur…

【实践篇】领域驱动设计:DDD工程参考架构 | 京东云技术团队

背景 为什么要制定参考工程架构 不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构,或改进的DDD四层架构,有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构…

数据仓库选择Greenplum还是SQL-on-Hadoop

Greenplum和Hadoop都是为了解决大数据并行计算而出现的技术,二者的相似点在于: 分布式存储数据在多个节点上。采用分布式并行计算框架。支持向外扩展来提高整体的计算能力和存储容量。支持X86开放集群架构。 但两种技术在数据存储和计算方法上&#xf…

ADS-600树脂,除COD有机物树脂,大孔树脂型号,矿井水有机物

基于吸附功能的聚苯乙烯特种树脂 Tulsimer ADS-600 是一款没有离子官能基的,由交联聚苯乙烯合成的功能强大的吸附型树脂。 Tulsimer ADS-600 主要应用于水溶液中吸附酚及其化合物,氯代烃等含氯物质,表面活性剂,氨基酸&#…

Python系列模块之标准库OS详解

感谢点赞和关注 ,每天进步一点点!加油! 目录 ​一、模块 1.1 模块的定义 1.2 模块的分类 1.3 模块的基本导入语法 二、Python中的包 三、标准库之os模块 实战: 钉钉告警应用 一、模块 1.1 模块的定义 Python 模块(Module)&a…

【JAVA程序设计】(C00139)基于Springboot+Thymeleaf的药店管理系统

基于SpringbootThymeleaf的药店管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本项目为基于SpringbootThymeleaf的药店管理系统(医院药品管理系统、医院管理系统),本项目主要功能为: 药品库存管理(登记…

0基础学习VR全景平台篇第27章:场景管理-视角功能

大家好,欢迎收看蛙色平台免费教程! 功能位置示意 一、本功能将用在哪里? 视角功能:指观看者打开场景时,默认展示的位置内容,可针对视角显示范围、视角远近范围进行设置。 应用场景:几乎每个作品…

通过nginx解决vue项目打包后跨域代理失效问题

这里 我的接口是写在 http://localhost:80上的 接口名是user 需要一个id路径参数 我们知道 80是默认 所以就可以不带端口因此访问就是http://localhost/user/1 然后 我vue项目中的 vue.config.js 配置如下 const { defineConfig } require(vue/cli-service) module.exports …

00后职场人,怎么做到刚来就涨薪5k? 原因竟是学会了这个宝藏工具

经常有粉丝问我有“有哪些适合绝大多数普通职场人的制作大屏的工具?” 确实,在这个内卷的时代,大家想要的是更加炫酷的汇报效果。要满足大多数职场人的大屏工具首先一定要满足以下三点: (1)简单易上手&am…

使用Python技术开发一个社区婴幼儿预防接种系统

婴幼儿预防接种作为社区预防保健的主要工作之一,是儿科临床和公共卫生保健的基础,目前国内外对婴幼儿预防接种工作非常重视。我们社区在工作中改变传统服务理念,根据不同年龄段婴幼儿的心理状态,采取不同心理护理应用,进行婴幼儿预防接种。 本论文主要论述了如何使用Python技术…

国际原油如何投资?国际原油期货投资策略有哪些?

国际原油产品的规模比较大,市场的交易环境是非常安全的,相信很多人都对国际原油产品的投资比较感兴趣,但是个人投资者需要注意:要买卖实体原油几乎是不可能的,投资者参与国际原油投资最方便快速的方式,就是…

【TCP】滑动窗口

滑动窗口 概念: 我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。 这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。 如果你说完一句话…

大数据面试题:请描述MapReduce中shuffle阶段的工作流程,如何优化shuffle阶段?

map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,这个流程就叫shuffle。 shuffle: 洗牌、发牌——(核心机制:数据分区,排序,合并)。 shuffle是Mapreduce的核心&…

【社区图书馆】记:读完《网络工程师的Python之路:网络运维自动化实战(第2版)》读后感【书评】

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录 书籍整体感受书籍中分了11大章&#…

springboot+vue实习管理系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的实习管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…

数据库链接池从100ms优化到3ms!

数据库连接池的配置是开发者们常常搞出坑的地方,在配置数据库连接池时,有几个可以说是和直觉背道而驰的原则需要明确。 1万并发用户访问 想象你有一个网站,压力虽然还没到Facebook那个级别,但也有个1万上下的并发访问——也就是…

开发中造成空指针的常见用法,如何避免

1. 前言 《手册》的第 7 页和 25 页有两段关于空指针的描述: 【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 返回类型为…

AIGC周报|让AI来画《海贼王》;苹果限制员工使用ChatGPT;李彦宏:不担心大模型会让工作消失

AIGC(AI Generated Content)即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT,以及 DallE 2、Stable Diffusion 等文生图模型,都属于 AIGC 的典型案例,它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …