【JVM】调优工具

这里简单介绍一下各种调优用到的工具

一,环境准备

首先我们需要准备好Java环境,和win上的jdk环境(图形化界面如jconsole只有jdk中有)。

有这样一个类Prolem,每个线程都会带来100个垃圾对象,线程new完100个垃圾对象基本就结束了,等待3秒后重新开始制造新的垃圾对象,而线程池中有50个这样的线程。毫无疑问,这样会造成JVM中内存的占用的彪高。


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 从数据库中读取信用数据,套用模型,并把结果进行记录和传输*/public class Problem {private static class CardInfo {BigDecimal price = new BigDecimal(0.0);String name = "张三";int age = 5;Date birthdate = new Date();public void m() {}}private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,new ThreadPoolExecutor.DiscardOldestPolicy());public static void main(String[] args) throws Exception {executor.setMaximumPoolSize(50);for (;;){modelFit();Thread.sleep(100);}}private static void modelFit(){List<CardInfo> taskList = getAllCardInfo();taskList.forEach(info -> {// do somethingexecutor.scheduleWithFixedDelay(() -> {//do sth with infoinfo.m();}, 2, 3, TimeUnit.SECONDS);});}private static List<CardInfo> getAllCardInfo(){List<CardInfo> taskList = new ArrayList<>();for (int i = 0; i < 100; i++) {CardInfo ci = new CardInfo();taskList.add(ci);}return taskList;}
}

将这个类复制到Linux中,javac Problem编译Problem类到当前文件夹下,然后使用java -Xms20M -Xmx20M -XX:+PrintGC -XX:+PrintGCDetails Problem,指定堆大小为20M不变,这样使得堆GC频率会很频繁,-XX:+PrintGCDetails开启GC细节日志,直接启动Problem中的主方法。

二,主要工具

在收到报警后,如何检查问题出在哪里呢?

top命令,查看本台Linux机器中资源占用情况,可以看到CPU占满的是pid为27282的Java进程。内存没有显示占用多少是因为我指定了堆内存为20M,其实内存此时已经占用满了。

在这里插入图片描述

top -Hp Pid 命令,top -Hp加上Java进程的pid,展示Java内部线程的资源占用情况。在这个栗子中可以看到cpu很高,是因为垃圾占用一直很高,于是GC线程一直工作。

在这里插入图片描述

GC日志,这里的GC日志是我们直接使用-XX:+PrintGCDetails在前台打印的日志,生产看JVM日志要去分析jmap的dump文件。可以看到先是YGC,回收速度小于垃圾对象制造速度,于是很快就变成了Full GC,后期甚至还会堆内存溢出。

在这里插入图片描述

在这里插入图片描述

jps,列出Java进程的进程ID和主类名称。这个命令通常用于查看正在运行的Java进程,以便进行监控或管理。通过这个命令查看Problem类的进程的pid,相比top,快速便捷,方便后面使用jmap等工具。

在这里插入图片描述

jstack定位线程堆栈信息,看到线程在等待

在这里插入图片描述

jmap,比较重要的分析工具。

jmap -histo pid | head numbermap - histo命令用于生成Java堆内存中实例对象数量及占用内存的直方图,显示堆中各个对象类型的数量和大小。后面跟上管道符和head命令,展示占用靠前多少的对象。

在这里插入图片描述

jmap -dump,使用jmap去dump堆栈信息。分析dump文件,如果是上G的文件,直接用vim太Low了效率也低。。

分析dump文件的工具,eclipse有MAT(免费),idea有JProfiler插件(收费,499美元),好货不便宜啊。。此外也可以使用jvirsualvm来进行dump文件分析,jhat也可以,但是比较古老。

在这里插入图片描述
jmap -heap pid,打印堆内存信息。

[root@192 code]# jmap -heap 26983
Attaching to process ID 26983, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.361-b09using thread-local object allocation.
Parallel GC with 4 thread(s)Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 209715200 (200.0MB)NewSize                  = 69730304 (66.5MB)MaxNewSize               = 69730304 (66.5MB)OldSize                  = 139984896 (133.5MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 16777216 (16.0MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 4294963200 (4095.99609375MB)G1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 52428800 (50.0MB)used     = 18120048 (17.280624389648438MB)free     = 34308752 (32.71937561035156MB)34.561248779296875% used
From Space:capacity = 8650752 (8.25MB)used     = 8639984 (8.239730834960938MB)free     = 10768 (0.0102691650390625MB)99.87552527225378% used
To Space:capacity = 8650752 (8.25MB)used     = 0 (0.0MB)free     = 8650752 (8.25MB)0.0% used
PS Old Generationcapacity = 139984896 (133.5MB)used     = 14180352 (13.5234375MB)free     = 125804544 (119.9765625MB)10.129915730337078% used1230 interned Strings occupying 70952 bytes.

jmap -clstats pid,打印Java进程的元数据信息,也就是方法区的信息

在这里插入图片描述

arthas,阿里的开源工具,用attach的方式监控,相当于对流进行代理,而不是图形化界面实时命令,因此arthas对系统的负荷很小,命令行界面也比较友好。

安装arthas[3],安装很简单,直接下载jar包后启动即可。

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

回车后,arthas会显示检测到的Java进程,按顺序从1开始排列,我们输入1,选择把arthas挂到第一个进程上。看到下面的ARTHAS图形,启动成功。

在这里插入图片描述
arthas启动后(在启动arthas之前,我将Java进程停掉,堆内存指定为200M并重新启动,不然20M容易导致arthas挂失败)。可以看到Linux用户从root变为了arthas,arthas用户可以使用如下命令。

jvm,类似于jinfo的效果,显示jvm的各种参数信息

在这里插入图片描述
在这里插入图片描述
dashboard,监控大盘,可以看到线程、内存的各种状态

在这里插入图片描述

thread,只查看进程

在这里插入图片描述

jad,反编译,定位动态代理生成类的问题、版本问题等。

在这里插入图片描述

redefine,热替换,可以在不用重新部署项目的情况下,将代码替换掉。但是有一些限制,只能改方法实现(方法已经运行完成),不能改方法名, 不能改属性。

比如我们有2个类如下:

import java.io.IOException;public class TestRedefine {public static void main(String[] args) throws IOException {while (true){System.in.read();new RedefineNode().out();}}}
public class RedefineNode {public static void out(){System.out.println(1);}}

将其启动后,输入字母,只能得到输出1.

[root@192 code]# java TestRedefine
a
1
1
a
1
1
s
1
1

现在我们直接vim类RedefineNode ,将1换成2,并且javac RedefineNode.java。编译成class文件。最终在arthas中将其热替换,再用反编译查看代码,发现已经换成了2.

在这里插入图片描述

测试输入输出,输出变成了2,热替换成功。

[root@192 code]# java TestRedefine
a
1
1
a
1
1
s
1
1
a
2
2
d
2
2
s
2
2

heapdump /root/gc2024051401.hprof,arthas对jvm进行dump,格式要为hprof。

配合jdk工具jhat对dump文件进行分析,

在这里插入图片描述
Linux ip+7000端口,打开jhat网址

在这里插入图片描述
jhat的各项是按照字母顺序排列的,直接拉到最下方,others才是有用的。

在这里插入图片描述

如jhat统计类的实例对象数量

在这里插入图片描述

OQL,通过语句查询想要的结果
在这里插入图片描述
或者也可以把dump文件拿出来,用jvirsualvm的装入,载入dump文件来分析。比如这里我用finalshell,将dump文件下载后,使用jvrisualvm分析。

在这里插入图片描述

下载在桌面自动创建的文件夹中,将其装入,查看dump文件中的信息,可以看到哪个对象是最多的。

在这里插入图片描述

三,作用不大的工具

jinfo pid,可以看到一些java进程的配置信息,作用不大

在这里插入图片描述
jstat -gc pid。每500毫秒打印一次gc日志,但是信息很抽象,比较晦涩

在这里插入图片描述
jconsole,下图能看到一些类似jinfo的信息。jconsole等调试工具在jdk中包含,在win中远程连接Linx即可,但是远程连接图形化界面,相当于实时使用命令监控,对线上系统有很大压力,因此图形化界面如jconsole、jvirsualvm不建议线上使用。jconsole在连接时有一些注意事项【注1】。

在这里插入图片描述

能看到内存在节节升高,回收完短暂的掉下去一点,然后又升高,但是没啥用,分析不出来问题
在这里插入图片描述
jvirsualvm,也是jdk中自带。使用时也是有一些注意事项,放到最后【注2】。

可以看到jvirsualvm终于比jconsole好用一些了,能够看到内存中哪些对象最多,但是如果业务代码多且复杂,可能无法借此分析出结果。不过总归比jconsole好一些,同样,jvirsualvm不推荐线上使用。

在这里插入图片描述
在这里插入图片描述
中止Linux上的jstatd,就可以终止jvirsualvm的可视化。
在这里插入图片描述

【注1】
连接jconsole的Java进程,在启动时,需要加上以下参数,以支持JMX协议。ip换成Linux的,port不用换,是JMX协议的远程通讯端口。

java -Djava.rmi.server.hostname=192.168.18.128 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=11111 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false Problem

自己的虚拟机如果防火墙或者iptables开启,可以关闭。生产上开放出端口即可。
然后在win上的jconsole上连接192.168.18.128:11111。

在这里插入图片描述

【注2】
Linux上,进入JAVA_HOME的bin目录下,

vi jstatd.all.policy 

在其中保存如下内容:

grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;
};

启动jstatd,开启jstatd后,此时就可以用win的jvirsualvm连接Java进程了

jstatd -J-Djava.security.policy=D:\tools.policy

在这里插入图片描述

参考文章:
[1],使用jvisualvm的jstatd方式远程监控Java程序
[2],jstatd 启动报错解决:Could not create remote
object
[3],arthas/README_CN.md

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

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

相关文章

翻译《The Old New Thing》- What does the CS_OWNDC class style do?

What does the CS_OWNDC class style do? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20060601-06/?p31003 Raymond Chen 2006年06月01日 简要 本文讨论了CS_OWNDC窗口类样式的影响&#xff0c;它让窗口管理器为窗口创建一个永久的设…

品牌银饰售卖|基于SSM+vue的品牌银饰售卖平台的设计与实现(源码+数据库+文档)

品牌银饰售卖平台 目录 基于SSM&#xff0b;vue的品牌银饰售卖平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1前台功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

Redission分布式锁 - 抢课系统

使用Redission分布式锁与Kafka消息队列&#xff0c;实现学生抢课系统&#xff08;高并发秒杀场景&#xff09;。 目录 一、思路1.为频繁访问的信息设置缓存&#xff08;1&#xff09;登陆&#xff08;2&#xff09;课程任务信息&#xff08;3&#xff09;用户抢课记录 2.消息队…

知识图谱开发日志

应用于应用环境的配置.测试.发布 假如你写了一个web,并且测试调试都没有问题 并且,你想发给你的朋友,导师,或者部署到远程云服务器上 那么,你需要配置相同的软件,比如数据库,web服务器,必要的插件,库,etc…但这并不一定能保证软件的正常运行,因为别人可能使用完全不同的操作系统…

在VMware安装Androidx86_64系统要点

上篇使用VirtualBox安装过Androidx86_64系统&#xff0c;尝试了没有蓝牙共享的好方法。本篇记录下使用Vmware虚机安装改系统&#xff0c;并使用蓝牙共享功能。 1.准备材料 本篇安装环境是安装Window10_64位系统。需要下载好Vmware安装包&#xff0c;VMWare版本&#xff1a;VMw…

python:rename函数用法

在Pandas库中&#xff0c;rename函数是一个非常实用的方法&#xff0c;用于重命名DataFrame或Series的轴标签&#xff08;如列名或索引&#xff09;。以下是rename函数的基本用法、参数以及一些示例。 1.rename基本语法 DataFrame.rename(mapperNone, indexNone, columnsNone…

【以规划为导向的自动驾驶】Planning-oriented Autonomous Driving

ABSTRACT 研究背景&#xff1a; 现代自动驾驶系统是顺序化地排列多个任务模块, 近期的主流方法&#xff1a; ①为单个任务部署独立模型 ②设计具有分离式头部的多任务(multi-task)范式。 但是&#xff0c;这些方法会累积误差或任务间协同不足而不利于自动驾驶。 作者认为重…

【devops】Linux 日常磁盘清理 ubuntu 清理大文件 docker 镜像清理

日常磁盘清理 1、查找大文件 find / -type f -size 1G2、清理docker无用镜像&#xff08;drone产生的残余镜像文件&#xff09; docker system prune -a一、清理服务器磁盘 1、查找大文件 在Ubuntu系统中&#xff0c;你可以使用find命令来查找大文件。find命令是一个强大的…

从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践

作者&#xff1a;武基鹏&#xff0c;无锡锡商银行 大数据技术经理 编辑整理&#xff1a;SelectDB 技术团队 导读&#xff1a;为实现数据资产的价值转化以及全面数字化、智能化的风险管理&#xff0c;无锡锡商银行大数据平台经历从 Hive 离线数据仓库到 Apache Doris 实时数据仓…

5G技术相关部分图解

1、面向5G商用网络的全系列解决方案 面向5G商用网络的全系列解决方案涵盖了从核心网到接入网的各个方面&#xff0c;确保网络的高性能、高可靠性和高安全性 2、2\3\4\5G带宽图解 G带宽的提升将推动许多新型应用的发展&#xff0c;并提供更快速、更可靠的移动通信体验。然而…

Springboot3 链接Redis遇到的报错(本文仅记录保存,优质文章移步springboot专栏)

出现的报错&#xff1a; cannot connect to Redisedis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is setredis wrong number of arguments for ‘auth’ command 其实上面的三个报错是不同界面显示的&#xff0c;后面两个是通过Ide…

git入门操作

一、介绍 Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。 二、注册Git代码托管平台账号 以下几个平台可供选择&#xff1a; Gitee: https://gitee.com/(国内) Gitee&#xff08;码云&…

【源码】2024全新多语言区块链交易所源码/期权交易/申购/币币秒合约交易所

全新ui&#xff0c;更新很多内容&#xff0c;具体看图&#xff0c;全部开源 全新多语言区块链交易所源码/期权交易/申购/币币秒合约交易所 - 吾爱资源网

03-数据结构(一)

链接&#xff1a;C# 数据结构_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1a541147Nk/?spm_id_from333.337.search-card.all.click&vd_source6eb7d966aa03ff5cb02b63725f651e68 链接&#xff1a;使用 C#.Net 学习掌握数据结构 (更新中)_哔哩哔哩_bilibili 一…

CheckStyle静态样式之道

优质博文&#xff1a;IT-BLOG-CN 在标准化的统一样式检查规范里&#xff0c;最为常用的统一样式工具是checkstyle插件&#xff0c;而不是国内阿里的代码规约插件。 【1】下载插件 【2】配置生效 配置生效及告警设置 【3】配置checkstyle.xml 官网地址 官网最新Releases 下面…

模拟量电机控制器PWM 输出隔离转换器4-20mA/0-5V/0-10V转50Hz/100Hz/1KHz/10KHz/100KHz

主要特性: 精度、线性度误差等级&#xff1a; 0.1、0.2、0.5 级4-20mA/0-5V/0-10V 等标准信号输入可选择RS485 通讯输入&#xff0c;支持 Modbus 协议PWM 信号输出&#xff0c;PWM 频率可选PWM 输出驱动能力可达 5A信号输入/信号输出 3000VDC 隔离可选择一进一出&#xff0c;一…

OpenAI 震撼发布:GPT-4o免费,实时语音视频交互开启新纪元

OpenAI 震撼发布&#xff1a;GPT-4o免费&#xff0c;实时语音视频交互开启新纪元 在仅仅问世17个月后&#xff0c;OpenAI 研制出了仿佛科幻片中登场的超级人工智能——GPT-4o&#xff0c;而且所有人都可以完全免费使用&#xff0c;让这个科技界的巨浪让人震撼无比&#xff01;…

真JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆。 反射性XSS漏洞 <% page language"java" contentType"text/ht…

图搜索算法-最短路径算法-贝尔曼-福特算法

相关文章&#xff1a; 数据结构–图的概念 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 图搜索算法 - 广度优先搜索法&#xff08;BFS&#xff09; 图搜索算法 - 拓扑排序 图搜索算法-最短路径算法-戴克斯特拉算法 贝尔曼-福特算法&#xff08;Bellman-Ford&#…

克鲁斯CLOOS机器人维修知识分享

克鲁斯工业机器人是一种高度精密的自动化设备&#xff0c;广泛应用于制造业、物流等领域。为了确保机器人的正常运行&#xff0c;了解一些基本的CLOOS工业机械手维修知识是必不可少的。 【常见CLOOS机械臂故障及解决方法】 1. 机器人无法启动&#xff1a;检查电源是否正常&…