SpringBoot web项目性能监控

新增两个接口:jmap 和 jstack,用于获取 Java 应用程序的内存堆转储(heap dump)和线程转储(thread dump)。

添加依赖:

implementation("commons-io:commons-io:2.11.0")

添加controller的API代码:


import org.apache.commons.io.FileUtils
import org.springframework.boot.actuate.management.HeapDumpWebEndpoint
import org.springframework.boot.actuate.management.ThreadDumpEndpoint
import org.springframework.core.io.Resource
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseBody
import org.springframework.web.bind.annotation.RestController
import java.io.IOException
import java.nio.charset.StandardCharsets
import javax.servlet.http.HttpServletResponse@RestController
@RequestMapping
class MonitorController(private val threadDumpEndpoint: ThreadDumpEndpoint?,private val heapDumpWebEndpoint: HeapDumpWebEndpoint?
) {@RequestMapping("jmap")@ResponseBody@Throws(IOException::class)fun jmap(response: HttpServletResponse?): String? {if (this.heapDumpWebEndpoint == null) {return "not existed"}val resource: Resource = this.heapDumpWebEndpoint.heapDump(true).getBody()val bytes: ByteArray = FileUtils.readFileToByteArray(resource.getFile())val delete: Boolean = resource.getFile().delete()return download(response!!, resource.getFilename()!!, bytes, delete.toString())}@GetMapping("jstack")@ResponseBodyfun jstack(response: HttpServletResponse): String? {if (threadDumpEndpoint == null) {return "not existed"}val threads = threadDumpEndpoint.textThreadDump()return download(response, "thread-dump.txt", threads.toByteArray(StandardCharsets.UTF_8), "")}private fun download(response: HttpServletResponse, fileName: String, bytes: ByteArray, value: String): String? {response.characterEncoding = "utf-8"response.contentType = "application/octet-stream"response.addHeader("Content-Length", bytes.size.toString())response.setHeader("Content-Disposition", "attachment; filename=$fileName")try {response.outputStream.use { outputStream ->outputStream.write(bytes)outputStream.flush()return value}} catch (exception: Exception) {return exception.message}}
}

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

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

相关文章

LeetCode刷题笔记第1480题:一维数组的动态和

LeetCode刷题笔记第1480题:一维数组的动态和 题目: 给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] sum(nums[0]…nums[i]) 。 请返回 nums 的动态和。 想法: 想要计算数组每个位置上的动态和,利…

C#常用关键字 收藏集

out 作为参数修饰符,它允许按引用而不是按值向方法传递参数。接口和委托的泛型类型参数声明中,该声明指定类型参数为协变。 public void Main(){double radiusValue 3.92781;//计算圆的周长和面积,并将结果返回给 Main().CalculateCircumf…

git修改版本发布时间

一、场景 发现git版本发布时,服务器时间有误,需要修改。 二、解决 (1)准备 时间戳转换网址:http://shijianchuo.wiicha.com/ (2)SQLite 数据库 连接到安装git的服务器,修改版本表…

综述列表(~2024.05.10)

(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 每周末更新,完整版进群获取。 Q 群在群文件,VX 群每周末更新。

多线程-写入读取文件,使用同步逻辑

在一个进程中&#xff0c;创建一个子线程。 主线程负责:向文件中写入数据 子线程负责:从文件中读取数据 要求使用线程的同步逻辑&#xff0c;保证一定在主线程向文件中写入数据成功之后&#xff0c;子线程才开始运行&#xff0c;去读取文件中的数据 #include <stdio.h> …

Linux0.11中MINIX 文件系统

阅读linux 的源码的时候对minix 文件系统有很多的疑惑&#xff0c;根据自己的认识将这些做一个总结。 MINIX 文件系统由六个部分组成&#xff0c;分别是引导块&#xff0c;超级块&#xff0c;i结点位图&#xff0c;逻辑块位图&#xff0c;i结点&#xff0c;数据块。 引导块&am…

部署xwiki服务需要配置 hibernate.cfg.xml如何配置?

1. 定位 hibernate.cfg.xml 文件 首先&#xff0c;确保您可以在 Tomcat 的 XWiki 部署目录中找到 hibernate.cfg.xml 文件&#xff1a; cd /opt/tomcat/latest/webapps/xwiki/WEB-INF ls -l hibernate.cfg.xml如果文件存在&#xff0c;您可以继续编辑它。如果不存在&#xff…

使用GitLab自带的CI/CD功能在远程服务器部署项目(三)

前置内容&#xff1a; 通过Docker Compose部署GitLab和GitLab Runner&#xff08;一&#xff09; 使用GitLab自带的CI/CD功能在本地部署项目&#xff08;二&#xff09; 目录 一、在GitLab服务器上生成私钥与公钥 二、将公钥拷贝到应用服务器上 三、将私钥给到Docker Exec…

深入解析Java中Set接口

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

静态工厂模式

静态工厂类替代构造方法 Boolean bBoolean.valueOf(true); 名字易于理解&#xff1b; 可以实现多态&#xff1b; 可以共享对象&#xff1b; jdbc的获得连接的操作也是静态工厂类&#xff0c;将实现交给了具体的数据库&#xff0c;解耦 DriverManager.getConnection(url,user,p…

Java面试题:描述一下Java中的堆内存是如何划分的,并解释每个区域的作用

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;堆内存是用于存储对象实例的区域&#xff0c;它在JVM启动时被创建。堆内存的划分方式和每个区域的作用如下&#xff1a; 年轻代&#xff08;Young Generation&#xff09;&#xff1a; Eden区&#xff1a;大多数对象首先…

Redis缓存篇

1.1 缓存击穿 缓存击穿跟缓存雪崩有点类似&#xff0c;缓存雪崩是大规模的key失效&#xff0c;而缓存击穿是某个热点的key失效&#xff0c;大并发集中对其进行请求&#xff0c;就会造成大量请求读缓存没读到数据&#xff0c;从而导致高并发访问数据库&#xff0c;引起数据库压…

web页面与原生android通信,调用原生android方法

注册初始化方法JsBridge //JS注册事件监听 function connectWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {callback(WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady,function() {callback(WebViewJav…

数据驱动实战二

目标 掌握数据驱动的开发流程掌握如何读取JSON数据文件巩固PO模式 1. 案例 对TPshop网站的登录模块进行单元测试 1.1 实现步骤 编写测试用例采用PO模式的分层思想对页面进行封装编写测试脚本定义数据文件&#xff0c;实现参数化 1.2 用例设计 1.3 数据文件 {"login…

设置LCD为第二终端

我一直使用xshell端&#xff0c;开发板通过串口和 xshell进行通信。 调试好LCD 驱动之后&#xff0c;可以设置 LCD 作为终端&#xff0c;也就是开发板使用自己的显示 设备作为自己的终端&#xff0c;然后接上键盘就可以直接在开发板上敲命令了&#xff0c;将 LCD 设置为终端控制…

IK分词器:深入了解中文分词的神兵利器

IK分词器&#xff1a;深入了解中文分词的神兵利器 文章目录 IK分词器&#xff1a;深入了解中文分词的神兵利器前言一、IK分词器简介二、IK分词器的工作原理三、IK分词器的特点四、IK分词器的应用场景 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我…

CPU探索:解密中央处理器的奥秘

前言 作为计算机的核心组件之一&#xff0c;CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09;在计算机系统中扮演着至关重要的角色。本文将带您深入了解CPU的基本原理、组成结构、不同类型以及未来的发展趋势。 1.CPU的基本原理 CPU是计算机中的“…

(贪心05) 无重叠区间 划分字母区间 合并区间

一、无重叠区间 力扣第435题 第一种方法&#xff1a; 个人思路&#xff1a; 按照区间左边界排序&#xff0c;然后从左开始遍历&#xff0c;每遍历到一个区间就要保证该区间之前的集合为不重叠区间&#xff08;贪心&#xff0c;局部最优解&#xff09;。 难点在于如何把新遍历…

人民币数字和中文汉字转换

在PHP中&#xff0c;将人民币的中文汉字金额转换为数字&#xff0c;或者将数字转换为人民币的中文汉字金额&#xff0c;通常需要自定义一些函数来实现这一转换过程。下面分别给出这两个转换的示例代码。 数字转人民币中文汉字 function numberToChinese($num) { $cnNums arr…

Linux(利用gdb进行调试)

gdb: gdb是GNU debugger的缩写&#xff0c;是编程调试工具。 gdb功能 1.启动程序&#xff0c;可以按照用户自定义的要求随心所欲的运行程序。 2.让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。 3.当程序停住时&#xff0c;可以检查此时程序中所发…