基于jdk1.8的Java服务监控和性能调优

JVM的参数类型

X参数

  • 非标准参数
  • -Xint: 解释执行
  • -Xcomp: 第一次使用就编译成本地代码
  • -Xmixed: JVM自己来决定是否编译成本地代码

默认使用的是mixed mode

用的不多, 只需要做了解, 用的比较多的是XX参数

XX参数

  • 非标准化参数
  • 相对不稳定
  • 主要用来JVM调优和Debug

Boolean:

  • 格式: -XX:[+-]<name> 表示启用或禁用name属性
  • 比如: -XX:+UseConcMarkSweepGC , 表示启用了CMS垃圾收集器
  • -XX:+UseG1GC , 表示启用了G1垃圾收集器

非Boolean类型:

  • 格式: -XX:<name>=<value>表示name属性的值是value
  • 比如:-XX:MaxGCPauseMillis=500 , GC的最大停顿时间为500ms
  • -XX:GCTimeRatio=19, 表示垃圾回收时间最长不会超过总运行时间的 1/20

-Xmx -Xms

  • 不是X参数, 而是XX参数

-Xms等价于-XX:InitialHeapSize

-Xmx等价于-XX:MaxHeapSize

查看JVM运行时参数

常见参数

  • -XX:+PrintFlagsInitial , 查看程序运行的初始值
  • -XX:+PrintFlagsFinal , 查看最终的值, 因为初始值可能会被修改(命令或程序修改)
  • -XX:+UnlockExperimentalVMOptions , 解锁实验参数, 因为JVM中并不是所有的参数都可以直接赋值, 需要先使用这个参数才可以进行赋值
  • -XX:+UnlockDiagnosticVMOptions , 解锁诊断参数
  • -XX:+PrintcommandLineFlags , 打印命令行参数

使用示例: java -XX:+PrintFlagsFinal -version

这里查看的仅仅是调用java命令的当前进程的配置值, 后续会使用jinfo查看启动后的进程的参数配置

jps

可以根据网站查询具体的jps使用方法:

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html#CHDCGECD

包含JVM命令的所有使用方法: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html

jps

jps -l

jinfo

查看最大内存:

jinfo -flag MaxHeapSize <pid>

查看垃圾回收器:

jinfo -flag UseConcMarkSweepGC <pid>
jinfo -flag UseG1GC <pid>
jinfo -flag UseParallelGC <pid>

可以看出使用的是并行回收的垃圾回收器

jstat查看JVM统计信息

命令格式:

options :

  • -class: 查看类加载信息
  • -compiler: 查看编译信息
  • -gc: 查看GC信息
  • -printcompilation: 查看JIT编译信息

类装载

# 1000 输出间隔1000ms 10 表示输出总次数为10次
jstat -class <pid> 1000 10

垃圾收集

-gc , -gutil , -gccause , -gcnew , -gcold

所有的输出含义都可以在上文中提到的网站中进行查询

  • Young区:
    • S0C:当前 Survivor Space 0 的容量(kB)。
    • S1C:当前 Survivor Space 1 的容量(kB)。
    • S0U:Survivor Space 0 的利用率(kB)。
    • S1U:Survivor Space 1 的利用率(kB)。
    • EC:当前 Eden Space 的容量(kB)。
    • EU :Eden Space 的利用率(kB)。
  • Old区:
    • OC:当前 Old Space 的容量(kB)。
    • OU:Old Space 的利用率(kB)。
  • MC:Metaspace 的容量(kB)。
  • MU:Metaspace 的利用率(kB)。
  • CCSC:压缩类空间的容量(kB)。
  • CCSU:压缩类空间的使用情况(kB)。
  • YGC:Young Generation 垃圾回收事件的数量。
  • YGCT:Young Generation 垃圾回收时间。
  • FGC:Full GC 事件的数量。
  • FGCT:Full GC 时间。
  • GCT:垃圾回收总时间。

JVM内存结构:

JIT编译

-compiler , -printcompilation

  • Compiled:执行的编译任务数量。
  • Failed:编译任务失败的数量。
  • Invalid:被失效的编译任务数量。
  • Time:执行编译任务所花费的时间。
  • FailedType:最后一个失败编译任务的编译类型。
  • FailedMethod:最后一个失败编译任务的类名和方法名。

jmap+MAT实战内存溢出

如何导出内存映像文件

  • 内存溢出自动导出
    • -XX:+HeapDumpOnOutOfMemoryError, 启用内存溢出时自动导出
    • -XX:HeapDumpPath=./ , 指定导出文件的路径
  • 使用jmap命令手动导出
    • option: -heap, -clstats, -dump: <dump-options>, -F

  • <none>: 打印共享对象映射
  • -dump: 将Java堆内存以hprof二进制格式转储到文件中
  • -finalizerinfo: 打印等待终结的对象信息
  • -heap: 打印垃圾收集器使用情况、
  • -histo: 打印堆直方图,包括Java类的对象数量、内存大小和完全限定类名
  • -clstats: 打印每个类加载器的统计信息,包括名称、活动状态、地址、父类加载器以及已加载的类数和大小
  • -F: 强制模式,用于在pid不响应时使用-dump或-histo选项
  • -h或-help: 打印帮助信息
  • -J flag: 将flag传递给运行jmap命令的Java虚拟机
# dump出运行程序的堆状态, 以二进制文件格式保存到当前命令路径下的heap.hprof
jmap -dump:format=b,file=heap.hprof 48954

双击文件直接在IDEA中就可以直接查看分析结果:

分析内存溢出

测试触发内存溢出

测试com.imooc.monitor_tuning.chapter2.MemoryController#heap

idea程序启动运行参数:

-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./data

请求: http://localhost:8080/heap

使用mat分析内存对象

使用mat查看:提示可能内存溢出的是某个controller

查看GC Roots, 排除弱引用,软引用等,只看强引用

分析得知: Tomcat的thread引用了一个MemoryController, MemoryController引用了一个UserList, list里面是所有的User对象

使用mat查看对象占的字节数

使用IDEA自带的进行分析

jstack实战死循环与死锁

一般CPU飙升很有可能就是死循环之类, 这时候就需要定位哪个线程出了问题

基本使用

  • jstack [ options ] pid:打印指定进程 ID 的 Java 进程的堆栈跟踪信息。
  • jstack [ options ] executable core:打印从指定 Java 可执行文件生成的核心转储文件的堆栈跟踪信息。
  • jstack [ options ] [ server-id @ ] remote-hostname-or-IP:打印远程调试服务器主机名或 IP 地址上的 Java 进程的堆栈跟踪信息。
  • -F:当 jstack [ -l ] pid 没有响应时,强制进行堆栈转储。
  • -l:打印有关锁的其他信息,例如 java.util.concurrent 可拥有同步器的列表。有关 AbstractOwnableSynchronizer 类的说明,请参见 http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer.html 。
  • -m:打印混合模式堆栈跟踪,其中包含 Java 和本地 C/C++ 帧。

其中,pid 表示进程 ID,executable 表示 Java 可执行文件,core 表示核心转储文件,remote-hostname-or-IP 表示远程调试服务器主机名或 IP 地址,server-id 是可选的唯一 ID,用于在同一远程主机上运行多个调试服务器时进行区分。jps 命令可以用于获取在计算机上运行的 Java 进程列表,jsadebugd 命令可以用于启动远程调试服务器。

简单实用:

# 指定pid简单输出分析一下
jstack 61091 > data/61091.txt

线程生命周期和状态:

具体可以参考: JAVA线程状态及状态间转换介绍 | 盖娅计划

死循环分析

打包程序为jar包到远程服务器进行运行

上传服务器:

# 需要改为你自己的服务器用户和ip地址
scp target/monitor_tuning-0.0.1-SNAPSHOT.jar root@172.16.237.144:/root/

登录服务器,然后启动服务:

java -jar monitor_tuning-0.0.1-SNAPSHOT.jar

浏览器访问: http://172.16.237.144:8080/loop , 可以多开几个窗口访问

再开一个服务端的端口进行查看负载和进程:

打印stack信息:

jstack 36850 > 36850.txt

查看对应的进程的线程信息:

# 用于查看进程 36850 的线程信息。具体来说,-p 选项指定要查看的进程 ID,-H 选项表示显示线程层次结构。
top -p 36850 -H

由于Stack的信息是16进制,所以需要打印一下:

printf "%x" 36870

得到对应的16进制的线程id为9006, 然后打开前面的打印的栈信息进行查看,

这里可以下载下来用一些软件查看,不建议使用vim直接在线上环境打开 36850.txt,这里只是测试这样查看

vim 36850.txt
## /9006 即可找到

定位到是com.imooc.monitor_tuning.chapter2.CpuController.getPartneridsFromJson 这个方法导致CPU升高, 最后检查代码进行修复

死锁分析

浏览器访问: http://172.16.237.144:8080/deadlock

jps查看程序的java进程:

同样适用jstack打印栈信息:

jstack 37143 > 37143.txt
vim 37143.txt

翻到文件末尾, 可以发现死锁的两个线程信息和对应的方法名

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue3+TS项目】硅谷甄选day02--后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 n…

阿里云u1服务器通用算力型CPU处理器性能测评

阿里云服务器u1通用算力型Universal实例高性价比&#xff0c;CPU采用Intel(R) Xeon(R) Platinum&#xff0c;主频是2.5 GHz&#xff0c;云服务器U1实例的基准vCPU算力与5代企业级实例持平&#xff0c;最高vCPU算力与6代企业级实例持平&#xff0c;提供2c-32c规格和1:1/2/4/8丰富…

elasticsearch结构化查询(一)

在上一篇中我们介绍了DSL相关的知识&#xff0c;接下来我们将会学习elasticsearch的结构化查询&#xff0c;同时也实践一下上一篇的DSL的查询用法 什么是结构化搜索? 从《Elasticsearch权威指南》上摘取部分解释如下: 结构化搜索是指查询包含内部结构的数据。日期&#xff0…

MATLAB 之 函数文件、特殊形式的函数和程序调试与优化

文章目录 一、函数文件1. 函数文件的基本结构2. 函数调用2.1 函数调用的格式2.2 函数的递归调用2.3 函数参数的可调性2.4 全局变量与局部变量 二、特殊形式的函数1. 子函数2. 内联函数3. 匿名函数 三、程序调试与优化1. 程序调试方法1.1 利用调试函数进行程序测试1.2 利用调试工…

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言&#xff1a; 在学完 MySQL 和 Java 后&#xff0c;我们通常会尝试使用 Java编译器 连接 MySQL数据库&#xff0c;从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识&#xff0c;因此我把 JDBC 包的下载及导入流程&#xff0c;以及 JDBC 的使用流程…

1.Buffer_Overflow-1.Basic_Jump

github上面的练习题 git clone https://github.com/Adamkadaban/LearnPwn 然后开始做 先进行 readelf 然后进行执行看看 是怎么回事 ./buf1发现就是一个输入和输出 我们checksec看看 发现stack 保护关闭 开启了NX保护 我们进入ida64看看反汇编 我习惯先看看字符串 SHITF…

C#异步编程之数据并行及任务并行

基于Parallel.ForEach的数据并行使用 1.数据非并行 var items new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; DateTime t1 DateTime.Now; foreach (var item in items) {Console.WriteLine("数据非并行输出:{0}", item); } 2.数据并行,只要使用Parallel.ForEach P…

Docker高频使用命令总结(镜像与容器命令)

目录 一.Docker常用命令总结 1.镜像命令管理 2.容器命令管理 二.Docker镜像操作命令 1.docker search&#xff1a;搜索镜像 2.docker pull&#xff1a;下载镜像 3.docker push&#xff1a;上传镜像 4.docker images&#xff1a;查看本地镜像 5.docker inspect &#x…

360+ChatGLM联手研发中国版“微软+OpenAI”

文章目录 前言360与智谱AI强强联合什么是智谱AI360智脑360GLM与360GPT大模型战略布局写在最后 前言 5月16日&#xff0c;三六零集团&#xff08;下称“360”&#xff09;与智谱AI宣布达成战略合作&#xff0c;双方共同研发的千亿级大模型“360GLM”已具备新一代认知智能通用模…

Springboot——事物管理

文章目录 事务管理一、 Spring事务管理1.1 事务回顾1.2 案例&#xff1a; 解散部门&#xff08;未开启事务&#xff09;1.3 事务管理注解Transactional1.4 事务管理日志开关1.5 rollbackFor 异常回滚属性1.6 propagation 事务传播行为1.7 解散部门并记录操作日志1.7.1 创建数据…

技术探秘:揭秘Bean Factory与FactoryBean的区别!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的29岁小编。今天&#xff0c;我们来聊一聊在Spring框架中常用的两个概念&#xff1a;beanFactory和FactoryBean。它们虽然看似相似&#xff0c;但实际上有着不同的用途和作用。让我们一起来揭开它们的神秘面纱吧&…

离散数学_九章:关系(6)

&#x1fa90;9.6 偏序 1、⛺偏序关系和偏序集⛲偏序关系⛲偏序&#xff08;关系&#xff09;的例子 a. “大于或等于” 关系b. “整除” 关系c. “包含” 关系 &#x1f3ac;偏序集&#x1f3ac;可比性&#xff08;comparability&#xff09; " ≼ " 符号a. 可比 &a…

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计(1)

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计&#xff08;1&#xff09; 苹果采摘机器人1、采摘流程与硬件设计2、机械臂驱动以及采摘轨迹设计2.1、台达A2电机驱动实现2.2、机械臂寻找苹果巡逻轨迹 苹果采摘机器人 1、采摘流程与硬件设计…

C++/Qt 小知识记录3

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识 QLineEdit限制输入大于0的正整数QLayout内清空已布局的WidgetWindows结束进程直接结束&#xff0c;子进程不响应结束事件正常结束&#xff0c;子进程响应结束事件 CMake关闭控制台Console实体与值对…

尾调用优化

尾调用优化 最近遇到一个堆栈溢出的问题&#xff0c;分析后发现可收敛为递归边界问题。结合“红宝书”中相关内容和ES6规范中的一些优化机制&#xff0c;整理记录如下。 前言 程序运行时&#xff0c;计算机会为应用程序分配一定的内存空间。应用程序会自行分配所获得的内存空…

数组或结构体赋值时memcpy与直接赋值的效率比较

先上结论&#xff1a; 二者不一定谁快通常情况下&#xff0c;数组维度越大&#xff0c;使用memcpy效率更高数组维度越大&#xff0c;直接赋值耗时主体是循环耗时 Note&#xff1a; “等号赋值”被编译器翻译成一连串的MOV指令&#xff0c;而memcpy则是一个循环。“等号赋值”比…

深入解析PyTorch中的模型定义:原理、代码示例及应用

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【一起啃书】《机器学习》第六章 支持向量机

文章目录 第六章 支持向量机6.1 间隔和支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 一些问题 第六章 支持向量机 6.1 间隔和支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , …

Day 1 认识软件测试——(软件测试定义、目的、原则)

Day 1 认识软件测试——(软件测试定义、目的、原则) 文章目录 Day 1 认识软件测试——(软件测试定义、目的、原则)软件测试的定义软件测试的目的软件测试的经济学问题黑盒测试白盒测试软件测试原则小结所谓软件测试,就是一个过程或一系列过程,用来确定计算机代码完成了其…

《我命由我不由天》蔡志忠——笔记一

目录 简介 经典摘录 三岁决定一生 父母该什么时候放手 确定将来要成为什么 积极主动为目标而努力 叛逆是最伟大的创意 父亲给蔡志忠最大的影响是教会他两件事 价值观缺陷导致的后果 人有三个阶段 简介 作者 蔡志忠&#xff0c;李虹。 蔡志忠&#xff1a;漫画家、哲…