【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…

winform中实现Oxyplot.WindowsForms.Plot的鼠标悬停坐标值展示

界面增加Oxyplot.WindowsForms.Plot&#xff0c;鼠标悬停显示坐标值。 PlotType PlotType.XY private void InitPlotModel() {this.plot.Model _PlotModel;this.plot.Enabled true;this.plot.MouseHover PlotView_MouseHover;this.plot.MouseHover PlotView_M…

HVV面试题2024护网蓝队面试题

一. 目前有防火墙&#xff0c;全流量检测&#xff0c;态势感知&#xff0c;IDS&#xff0c;waf&#xff0c;web服务器等设备&#xff0c;如何搭建一个安全的内网环境&#xff0c;请给出大概拓扑结构 &#xff08;适用于中高级&#xff09; 搭建安全内网环境拓扑结构&#xff1…

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 实时数据仓…

软考 系统架构设计师系列知识点之杂项集萃(7)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;6&#xff09; 上一回在讲习题的时候引出来软件能力成熟度&#xff0c;由于内容较多&#xff0c;因此并未讲完&#xff0c;本回把剩余知识讲完。 软件能力成熟度模型 软件能力成熟度模型&#x…

5G技术相关部分图解

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

百娣美业课程管理软件系统开发现成案例(H5+公众号+小程序+APP)

美业连锁商家管理系统如何开发&#xff1f; 1.需求分析 在开发美业连锁商家管理系统之前&#xff0c;首先要进行需求分析。商家需要明确自己的需求和目标&#xff0c;了解系统的功能模块和业务流程&#xff0c;为后续的开发提供明确的方向。 2.系统设计 根据需求分析的结果&…

BeautifulSoup 使用例子

BeautifulSoup 是一个 Python 库&#xff0c;用于解析 HTML 和 XML 文档。它创建一个解析树&#xff0c;使你能够轻松地访问文档元素和属性。bs4 是 BeautifulSoup 的版本 4&#xff0c;是目前最新的版本。以下是一些使用 BeautifulSoup 查找元素的基本方法&#xff1a; 通过标…

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 下面…