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

news2025/4/12 19:13:13

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

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

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

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

相关文章

Vivado综合属性系列之一 ASYNC_REG

目录 一、属性简介 二、示例 2.1 工程说明 ​ ​2.2 工程代码 ​ ​2.3 生效确认 一、属性简介 ASYNC_REG属性的作用对象为寄存器&#xff0c;寄存器添加该属性后&#xff0c;即表明寄存器的数据输入口D接收的是来自异步时钟触发器的数据或是该寄存器在一个同步链中属于…

【CSS系列】第九章 · CSS定位和布局

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Uni-app 离线打包 apk

Uni-app 离线打包 apk 1. Android Studio 下载 Android Studio官网 2. HBuilderX下载 HBuilderX下载 3. App离线SDK下载 Android 离线SDK - 正式版 下载后解压文件&#xff0c;将 HBuilder-Integrate-AS 重命名 build-template 并拷贝到一个专门打包用的文件夹下作为打包…

一行代码绘制高分SCI限制立方图

一、概述 Restricted cubic splines (RCS)是一种基于样条函数的非参数化模型&#xff0c;它可以可靠地拟合非线性关系&#xff0c;可以自适应地调整分割结点。在统计学和机器学习领域&#xff0c;RCS通常用来对连续型自变量进行建模&#xff0c;并在解释自变量与响应变量的关系…

抑梯度异常初始化参数(防止梯度消失和梯度爆炸)

这里设置3种参数初始化的对比&#xff0c;分别是&#xff1a;全初始化为0、随机初始化、抑梯度异常初始化。 首先是正反向传播、画图、加载数据所需的函数init_utils.py&#xff1a; # -*- coding: utf-8 -*-import numpy as np import matplotlib.pyplot as plt import sklea…

双层优化入门(3)—基于智能优化算法的求解方法(附matlab代码)

前面两篇博客介绍了双层优化的基本原理和使用KKT条件求解双层优化的方法&#xff0c;以及使用yalmip工具箱求解双层优化的方法&#xff1a; 双层优化入门(1)—基本原理与求解方法 双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码) 除了数学规划方法之外&#xff0c;…

springboot+vue大学生体质测试管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的大学生体质测试管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xf…

how2heap-fastbin_dup.c

不同libc版本的fastbin_dup.c源码有点小区别&#xff1a;主要是有tcache的&#xff0c;需要先填充 以下为有tcache的源码示例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <assert.h>int main() {setbuf(stdout, NULL);printf("This…

诗词·宇宙之梦

宇宙之梦 重力枷锁必将断&#xff0c;携君翱翔万里空。 迷途夜路寻踪迹&#xff0c;一声呼唤莫轻忽。 寻觅中&#xff0c;见红瞳&#xff0c;决不装假觉清白。 黑泽之中君沉沦&#xff0c;放之不下心怎静。 重力终将解开放&#xff0c;卫星翔空自由翱。 重量减半去忧愁&#xf…

RobotFramework+Eclispe环境安装篇

环境安装是学习任何一个新东西的第一步&#xff0c;这一步没走舒坦&#xff0c;那后面就没有心情走下去了。 引用名句&#xff1a;工欲善其事必先利其器&#xff01;&#xff01; Robotframework&#xff1a;一款 自动化测试框架。 Eclipse&#xff1a;一款编辑工具。可以编…

Android MVVN 使用入门

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种基于数据绑定的设计模式&#xff0c;它与传统的 MVC 和 MVP 模式相比&#xff0c;更加适合处理复杂的 UI 逻辑和数据展示。在 Android 开发中&#xff0c;MVVM 通常使用 Data Binding 和 ViewModel 实现。 下面是一个简…

正则化解决过拟合

本片举三个例子进行对比&#xff0c;分别是&#xff1a;不使用正则化、使用L2正则化、使用dropout正则化。 首先是前后向传播、加载数据、画图所需要的相关函数的reg_utils.py&#xff1a; # -*- coding: utf-8 -*-import numpy as np import matplotlib.pyplot as plt impor…

双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

上一篇博客介绍了双层优化的基本原理和使用KKT条件求解双层优化的方法&#xff1a; 双层优化入门(1)—基本原理与求解方法 这篇博客将介绍使用yalmip的双层优化问题的求解方法。 1.KKT函数 通过调用yalmip工具箱中的KKT函数&#xff0c;可以直接求出优化问题的KKT条件&#x…

算法(一)—— 回溯(2)

文章目录 1 131 分割回文串2 93 复原 IP 地址 s.substr(n, m) // 从字符串s的索引n开始&#xff0c;向后截取m个字符 例&#xff1a; string s "aaabbbcccddd"; string s1 s.substr(2,3); 此时s1为abb 1 131 分割回文串 切割问题&#xff0c;前文均为组合问题。组…

【Promptulate】一个强大的LLM Prompt Layer框架

本文节选自笔者博客&#xff1a; https://www.blog.zeeland.cn/archives/promptulate666 项目地址&#xff1a;https://github.com/Undertone0809/promptulate &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd;…

pyinstaller打包为.exe过程中的问题与解决方法

目录 问题一&#xff1a;.exe文件过大问题二&#xff1a;pyinstaller与opencv-python版本不兼容问题三&#xff1a;打开文件时提示***.pyd文件已存在问题四&#xff1a;pyinstaller打包时提示UPX is not available.另&#xff1a;查看CUDA成功配置的方法 pyinsatller -F -w mai…

瑞吉外卖 - 开发环境搭建(2)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

网络编程启蒙

文章目录 局域网、广域网WAN口LAN口那么什么是局域网和广域网呢&#xff1f; IP地址IPV4动态规划ipNAT IPV6IPV6的普及IPV6的应用 端口号协议协议分层协议分层的好处 OSI物理层数据链路层网络层&#xff08;全局&#xff09;传输层负责应用层网络设备所在分层网络分层中的一组重…

mybatis-plus实现乐观锁和悲观锁

目录 定义 场景 乐观锁与悲观锁 模拟修改冲突数据库中增加商品表 乐观锁实现 悲观锁 定义 1&#xff09;乐观锁 首先来看乐观锁&#xff0c;顾名思义&#xff0c;乐观锁就是持比较乐观态度的锁。就是在操作数据时非常乐观&#xff0c;认为别的线程不会同时修改数据&#x…

红旅在线语料库网站 开发笔记

桂林红色旅游资源在线语料库网站 &#xff08;Guilin Red Culture Corpus&#xff09;提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发(已获得原作者授权)。 项目仓库&#xff1a;RedCorpu…