详解JAVA程序调优

news2024/11/27 5:30:55

目录

1.概述

2.命令

2.1.查看JAVA进程

2.2.查看虚拟机状态

2.3.查看线程的情况

3.工具

3.1.jconsole

3.2.jvisualVM

4.实战场景


1.概述

在实际工作中我们难免会遇见程序执行慢、线程死锁等一系列的问题,这时候就需要我们定位具体问题然后来解决问题了。所谓的程序调优其实也就是定位问题然后解决问题。怎么定位问题喃?在JAVA程序的调优中我们无非要关注以下内容:

  • JVM的情况

  • 程序的情况

JVM的情况无其实就是去看一下它的类加载情况、内存使用情况、GC的情况。

程序的情况无非就是其线程的运行情况。

JDK为我们提供了两套方案来查看这两方面的情况,一方面是命令,另一方面是工具。

2.命令

2.1.查看JAVA进程

当然查看上面说的两方面情况的前提是要知道程序的进程是哪个对吧。所以首先是第一个常用的命令:

  • jps,查看当前机器上的java进程

jps命令默认输出进程的ID号以及对应的主启动类:

jps常用的一些参数:

  • -q:简洁模式,只输出Java虚拟机(JVM)的进程ID(PID),不显示主类名称或者其他详细信息。

  • -m:输出运行主类(即包含main方法的类)时传递给main方法的参数。

2.2.查看虚拟机状态

jstat,查看虚拟机状态,该命令需要跟上参数来指定具体查看的项目。

jstat的主要常用参数如下:

  • 监控堆内存(Heap): jstat -gc <pid> [interval] [count]:显示GC(Garbage Collection)统计信息,包括各代堆内存的大小、已用空间、已分配对象数以及GC次数与时间等。这里要注意的是如果只是想看内存情况,jmp命令也可以办到。

  • 类装载系统(Class Loader): jstat -class <pid>:显示类加载器相关的统计信息,比如已加载的类数量及其占用的空间。

  • 线程信息(Thread Information): jstat -thread <pid>:显示有关Java线程的信息,如活动线程数、死锁检测等。

  • GC算法详细信息(Detailed GC Algorithm Info): jstat -gccapacity <pid>:显示各个分代区域的容量配置。 jstat -gcutil <pid>:提供更详细的GC使用率信息,包括堆区的使用率和永久代的使用情况。

jstat -gc的结果对应的字段含义如下:

  • 年轻代相关指标: S0C: 第一个幸存区(Survivor Space 0)的当前容量(字节)。 S1C: 第二个幸存区(Survivor Space 1)的当前容量。 S0U: 第一个幸存区当前已使用的空间。 S1U: 第二个幸存区当前已使用的空间。

  • Eden区和老年代相关指标: EC: Eden区的当前容量。 EU: Eden区当前已使用的空间。 OC: 老年代(Old Generation)的当前容量。 OU: 老年代当前已使用的空间。

  • 元空间(Metaspace)或永久代(Permanent Generation,在JDK 1.8之前的版本中): MC: 元空间的当前容量(在JDK 1.8及更高版本中)或永久代的当前容量(在JDK 1.8之前)。 MU: 元空间当前已使用的空间或永久代当前已使用的空间。

  • 垃圾收集次数和时间: YGCT: 自JVM启动以来,年轻代垃圾回收(Young Generation Collection)所花费的总时间。 FGCT: 自JVM启动以来,全局或全堆垃圾回收(Full Garbage Collection,也可能是并发标记清除等类型的GC)所花费的总时间。 GCT: 总共的垃圾回收时间(YGCT + FGCT)。

jstat -gccapacity 结果对应的字段含义如下:

  • NGCMN - 新生代(Young Generation)的最小容量。

  • NGCMX - 新生代的最大容量。

  • NGC - 当前新生代的实际容量。

  • OGCMN - 老年代(Old Generation)的最小容量。

  • OGCMX - 老年代的最大容量。

  • OGC - 当前老年代的实际容量。

  • PC/MC - 元空间(MetaSpace)的最小容量(在JDK 1.8及更高版本中)。在JDK 1.8之前,这里是永久代(PermGen)的相关字段。

  • PC/MC - 元空间的当前容量。

  • CCSMN - 如果存在的话,表示压缩类空间(Compressed Class Space)的最小容量(在启用压缩类空间的情况下)。

  • CCSMX - 压缩类空间的最大容量。

  • CCSC - 当前压缩类空间的实际容量。

  • OC (Old Capacity): 表示当前老年代(Old Generation)的容量,即当前老年代能容纳多少内存空间。

  • MCMN (Metaspace Capacity Minimum): 在JDK 1.8及更高版本中,这个字段指的是元空间(Metaspace)的最小容量。元空间取代了永久代(PermGen),用于存储类元数据和静态变量等。

  • MCMX (Metaspace Capacity Maximum): 表示元空间的最大容量,即元空间允许增长到的最大内存大小。

  • MC (Metaspace Capacity): 表示当前元空间的实际容量,即当前元空间占用的内存大小。

jstat -gcutil 结果对应的字段含义如下:

  • S0:第一个幸存区(Survivor Space 0)的使用率。

  • S1:第二个幸存区(Survivor Space 1)的使用率。

  • E:伊甸园区(Eden Space)的使用率。

  • O:老年代(Old Generation)的使用率。

  • M:元空间(Metaspace)的使用率。在JDK 1.8及更高版本中,元空间取代了永久代(PermGen)来存储类的元数据和静态变量。

  • CCS(如果存在):压缩类空间(Compressed Class Space)的使用率(在启用压缩类空间的情况下)。

  • YGC:自JVM启动以来,年轻代(Young Generation)垃圾回收的次数。

  • YGCT:自JVM启动以来,年轻代垃圾回收所消耗的总时间。

  • FGC:自JVM启动以来,全局或全堆(Full GC)垃圾回收的次数。

  • FGCT:自JVM启动以来,全局或全堆垃圾回收所消耗的总时间。

  • GCT:自JVM启动以来,所有垃圾回收(包括年轻代和全局)所消耗的总时间。

2.3.查看线程的情况

查看线程的情况无非就是抓一下线程的执行记录,也就是线程快照,jstack,可以用来抓线程快照,从而展示JVM当前线程的一个总体情况。

如果Java进程启用了远程调试,jstack可以连接到远程主机上的调试端口来获取线程堆栈信息:

jstack [-l] <host>:<port>

其中,-l 参数会包含锁定信息,有助于发现死锁问题。

jstack命令输出的信息通常包括:

  • 线程ID(Thread ID)和线程名称(Thread Name)

  • 线程的状态(如RUNNABLE、BLOCKED、WAITING、TIMED_WAITING)

  • 线程执行的Java方法堆栈(Method Stack Trace),按照调用顺序逐层显示,这有助于追踪线程执行流和识别阻塞点。

通过分析jstack命令的输出,可以快速找到哪些线程处于何种状态,以及可能导致性能瓶颈或问题的代码位置,从而指导进一步的问题排查和性能调优工作。

3.工具

3.1.jconsole

连接上我们想监控的程序就可以看到,这其实就是个集成了前文所有命令的功能的图形化界面:

这里需要注意的是jconsole可以用来监控MBean,也就是用JMX自行实现的监控指标,对JMX不了解但是有兴趣的读者可以移步:

3.2.jvisualVM

jvisualVM其实和jconsole在功能上大部分是重叠的也是那些命令的图形化工具:

但是其和jconsole不同的是:

当我们用到了JMX,有自定义的MBean的时候一般用jconsole来进行可视化监控。当我们需要导入线程快照的时候一般用jvisualVM。

为什么会导入jvisualVM喃?是因为在实际的生产环境中,为了防止被攻击,服务器不会开出去太多的端口,所以想通过JDK的监控工具直接远程到服务器上去其实是比较难的,所以一般是用jstack命令去抓一段线程快照,然后拉到本地来用jvisualVM来进行可视化分析从而定位问题。

4.实战场景

下面是一些使用上述JDK工具进行具体场景优化和问题排查的例子:

示例1:使用jps和jstat排查内存泄漏

场景:一个长期运行的Java服务突然出现内存占用过高,疑似存在内存泄漏。

操作: 首先,使用jps命令找到目标Java进程的ID。 接着,利用jstat -gcutil <pid>周期性地监控JVM的内存使用情况,包括年轻代、老年代和元空间的使用率,以及垃圾回收的次数和时间。 如果观察到老年代使用率不断攀升且垃圾回收频繁且无效,则可能存在内存泄漏。 进一步,通过jmap -dump:format=b,file=<filename>.hprof <pid>命令生成堆转储文件。 使用MAT(Memory Analyzer Tool)分析堆转储文件,查找是否存在大量未释放的对象及其引用路径。

示例2:使用jstack解决线程死锁问题

场景:一个Java应用在高负载下发生卡顿,初步判断可能是线程死锁。

操作: 使用jps找到目标进程ID。 执行jstack <pid>命令获取线程堆栈信息。 分析输出的线程堆栈,寻找那些状态为BLOCKED并且持有和等待资源相互关联的线程,这些往往是死锁的关键线索。 根据堆栈信息找到造成死锁的代码片段,修改代码以避免死锁发生。

示例3:使用jinfo动态调整JVM参数

场景:一个Java应用在运行时发现GC过于频繁,影响了系统性能。

操作: 使用jps找到目标进程ID。 使用jinfo -flag UseConcMarkSweepGC <pid>检查当前是否使用CMS垃圾收集器。 若确认为CMS,但是效果不佳,可以考虑调整GC参数,如增大初始堆大小 -Xms 或 最大堆大小 -Xmx,或者改变GC策略(如切换到G1垃圾收集器)。 使用jinfo -flag -Xms <new_size> <pid>或jinfo -flag -Xmx <new_size> <pid>动态调整堆大小(并非所有JVM版本都支持所有参数的动态调整)。

示例4:使用jconsole进行实时性能监控

场景:需要持续监控Java应用的CPU、内存、线程数等基础性能指标。

操作: 启动Java应用时添加 -Dcom.sun.management.jmxremote 等JMX远程监控相关参数。 运行jconsole,连接到目标Java应用。 在jconsole界面中,可以实时查看各项性能指标,并进行图表绘制和历史数据分析,快速发现潜在的性能瓶颈。 通过这些实际场景和操作步骤,可以看到JDK自带的各种工具在实际工作中是如何协同配合,帮助我们诊断和优化Java应用程序的。

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

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

相关文章

安科瑞路灯安全用电云平台解决方案【电不起火、电不伤人】

背景介绍 近年来 &#xff0c;随着城市规模的不断扩大 &#xff0c;路灯事业蓬勃发展。但有的地方因为观念、技术、管理等方面不完善 &#xff0c;由此引发了一系列安全问题。路灯点多面广 &#xff0c;一旦漏电就极容易造成严重的人身安全事故。不仅给受害者家庭带来痛苦 &am…

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类&#xff0c;就是更加抽象的类&#xff0c;也就是说&#xff0c;这个类不能具体描…

雷卯有多种接口与电源保护方案

在当今的电子设备中&#xff0c;各种接口和电源保护至关重要。它们不仅关乎设备的正常运行&#xff0c;更直接影响到数据传输的稳定性和设备的安全。雷卯公司以其专业的技术和丰富的经验&#xff0c;为您提供全面的接口与电源保护方案&#xff0c;确保您的系统安全稳定运行。 …

图像分割论文阅读:Automatic Polyp Segmentation via Multi-scale Subtraction Network

这篇论文的主要内容是介绍了一种名为多尺度差值网络&#xff08;MSNet&#xff09;的自动息肉分割方法。 1&#xff0c;模型整体结构 整体结构包括编码器&#xff0c;解码器&#xff0c;编码器和解码器之间是多尺度差值模块模块&#xff08;MSM&#xff09;&#xff0c;以及一…

golang grpc和protobuf的版本降级问题(version4 -> version3)

最后更新于2024年3月28日 10:57:52 简中没查到类似的文章。一点小事闹麻了&#xff0c;搞了一天&#xff0c;特意发出来造福大家。 所谓的版本就是下面这个东西proto.ProtoPackageIsVersion4或者proto.ProtoPackageIsVersion3&#xff1a; 目的 为了适配旧代码&#xff0c…

探索c++:string常用接口 迷雾

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、string类 这里我们对string类进行一个简单的总结&#xff1a; string是表示字符串的字…

蓝桥小白入门赛6

原题链接&#xff1a;第 6 场 小白入门赛 - 蓝桥云课 目录 A、元宵节快乐 B、猜灯谜 C、数学奇才 D、你不干&#xff1f;有的是帕鲁干&#xff01; E、等腰三角形 F、 计算方程 A、元宵节快乐 签到题 print("Today AK!") B、猜灯谜 模拟&#xff0c;特判下…

容器四(Map 接口)

目录 HashMap 和 HashTable Map 接口中的常用方法 HashMap 底层实现 Hashmap 基本结构 存储数据过程 put(key,value) 取数据过程 get(key) 扩容问题 JDK8 将链表在大于 8 情况下变为红黑二叉树 Map 就是用来存储“键(key)&#xff0d;值(value) 对”的。 Map 类中存储的…

《科技创新与应用》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a; 问&#xff1a;《科技创新与应用》是什么级别期刊&#xff1f; 答&#xff1a;省级&#xff1b;主管单位&#xff1a;黑龙江省科学技术协会&#xff1b;主办单位&#xff1a;黑龙江省创联文化传媒有限公司 问&#xff1a;《科技创新与应用》是核心期刊…

链游系统开发运营版丨链游系统开发指南教程

在当今数字经济时代&#xff0c;区块链技术的发展不仅改变了金融行业&#xff0c;也深刻影响了游戏产业。链游系统&#xff08;Blockchain Game System&#xff09;作为区块链技术与游戏行业的结合&#xff0c;正在成为新一代游戏的趋势。本文将为您详细介绍链游系统的开发与运…

2024年【N1叉车司机】考试技巧及N1叉车司机复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试技巧参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总&#xff0c;相对有效帮助N1叉车司机复审考试学员顺利通过考试。 1、【多选题】《中华人民…

南京观海微电子---Vitis HLS的工作机制——Vitis HLS教程

1. 前言 Vitis HLS&#xff08;原VivadoHLS&#xff09;是一个高级综合工具。用户可以通过该工具直接将C、 C编写的函数翻译成HDL硬件描述语言&#xff0c;最终再映射成FPGA内部的LUT、DSP资源以及RAM资源等。 用户通过Vitis HLS&#xff0c;使用C/C代码来开发RTL IP核&#x…

思通数科:利用开源AI能力引擎平台打造企业智能搜索系统

在信息爆炸的时代&#xff0c;如何高效地管理和检索海量数据已成为企业和个人面临的一大挑战。思通数科 StoneDT 多模态AI能力引擎平台&#xff0c;以其强大的自然语言处理&#xff08;NLP&#xff09;、OCR识别、图像识别和文本抽取技术&#xff0c;为用户带来了前所未有的智能…

第N6周:使用Word2vec实现文本分类

import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,pathlib,warnings #忽略警告信息 warnings.filterwarnings("ignore") # win10系统 device torch.device("cuda"if torch.cuda.is_ava…

深入探索Yarn:安装与使用指南

Yarn 是一个由 Facebook 开发的 JavaScript 包管理器&#xff0c;旨在提供更快、更可靠的包管理体验。它与 npm 类似&#xff0c;但在某些方面更加高效和可靠。本文将介绍如何安装 Yarn&#xff0c;并展示如何使用它来管理 JavaScript 项目的依赖。 1. 安装 Yarn Yarn 可以通…

vs2022 关于Python项目无法识别中文的解决方法

这是针对于vs2022安装和使用教程&#xff08;详细&#xff09;-CSDN博客 Python项目无法识别中文的解决方法的文章 一、问题 1.输入代码 print("你好Hello world&#xff01;") 2.启动&#xff0c;发现代码里有中文报错 二、解决方法 1.选择菜单栏里的工具->…

阿里云服务器ECS经济型e和u1实例规格如何选择?

阿里云服务器u1和e实例有什么区别&#xff1f;ECS通用算力型u1实例是企业级独享型云服务器&#xff0c;ECS经济型e实例是共享型云服务器&#xff0c;所以相比较e实例&#xff0c;云服务器u1性能更好一些。e实例为共享型云服务器&#xff0c;共享型实例采用非绑定CPU调度模式&am…

线程的等待通知机制

线程的等待通知机制 一:情景再现:二:等待通知机制:2.1 wait()方法2.2 notify()方法2.22:唤醒了t2线程,t1线程仍处于阻塞等待状态2.23 唤醒了t1线程,t2线程仍处于阻塞等待状态2.24:notifyAll() 一:情景再现: 假设有3个滑稽,1号滑稽在ATM中取钱,2,3号滑稽只能在门口阻塞等待,1号…

VuePress基于 Vite 和 Vue 构建优秀框架

VitePress 是一个静态站点生成器 (SSG)&#xff0c;专为构建快速、以内容为中心的站点而设计。简而言之&#xff0c;VitePress 获取用 Markdown 编写的内容&#xff0c;对其应用主题&#xff0c;并生成可以轻松部署到任何地方的静态 HTML 页面。 VitePress 附带一个用于技术文档…

Vmware下减小Ubuntu系统占用系统盘大小

1、虚拟机设置下占用空间 如图&#xff0c;给虚拟机分配了120GB&#xff0c;已经占用116.9GB&#xff0c;开机会提示空间不足。 2、实际使用空间 ubuntu系统下使用“df -h”命令查看实际使用空间大小50GB左右 造成这个原因是&#xff0c;虚拟机的bug&#xff1a;在虚拟机的ub…