6. JVM调优工具详解及调优实战

news2024/11/22 4:24:44

JVM性能调优

  • 1. 前置启动程序
    • 1.1 Jmap
      • 1.1.1 Jmap查询内存信息
      • 1.1.2 Jmap查询堆信息
      • 1.1.3 jmap查询堆内存dump
    • 1.2 Jstack
    • 1.3 远程连接jvisualvm

本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。

课程内容:

1、Jmap,Jstack,Jinfo命令详解

2、Jvisualvm调优工具实战

3、JVM内存或CPU飙高如何快速定位

4、Jstat命令预估JⅣVM运行情况

5、系统频繁Full GC导致系统卡顿实战调优

6、内存泄露到底是怎么回事

1. 前置启动程序

事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用。

因此为了后续使用,我们直接从创建一个web项目开始,该部分知识是为了复习之前所学内容。

  1. 创建一个springboot项目
    ①. 首先打开idea,找到new module
    在这里插入图片描述
    ②. 点击next,填入下列信息
    在这里插入图片描述
    在这里插入图片描述
    ③. 点击下一步继续选择
    在这里插入图片描述
    ④. 继续下一步,检查信息
    在这里插入图片描述
    ⑤. 完成(如果包加载的特别慢,记得配置一下maven)
    在这里插入图片描述

  2. 写一个简单的小例子
    ①写一段代码

package com.ding.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/books")
public class BookController {
    @GetMapping
    public String getById(){
        System.out.println("springboot is running.......");
        return "springboot is running........";
    }
}

② 运行启动类
在这里插入图片描述

③ 访问成功
在这里插入图片描述
注意事项:记得把启动类与文件放的目录关系
在这里插入图片描述

  1. 将该项目打包成jar项目

在这里插入图片描述

我们现在启动该jar包。

找到文件的位置

在这里插入图片描述

java -jar jvm03-0.0.1-SNAPSHOT.jar

在这里插入图片描述
然后这个界面就可以访问了
在这里插入图片描述

1.1 Jmap

1.1.1 Jmap查询内存信息

  1. 用jps查看其进程id

在这里插入图片描述

此命令可以用来查看内存信息,示例个数以及占用内存大小。

jmap -histo 21480(进程号)

在这里插入图片描述

其实一般这样就可以了,但是这样不好看,所以我们可以把他写到一个文件里面。

jmap -histo 21480 > ./log.txt 

这样就打印到D盘去了

在这里插入图片描述

  • num:序号
  • instances:实例数量
  • bytes:占用空间大小
  • class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]

1.1.2 Jmap查询堆信息

jmap -heap 21480

在这里插入图片描述

1.1.3 jmap查询堆内存dump

jmap -dump:format=b,file=eureka.hprof 21480  

在这里插入图片描述

导出的信息:

在这里插入图片描述
这个信息的作用是等一会可以导到可视化工具里面的。例如jvisualvm。

在这里插入图片描述
进入之后是这个界面

在这里插入图片描述

在这个里面它可以装入文件,就是刚才我们所生成的文件。

在这里插入图片描述

我们就可以看到我们当时保存快照时候的堆信息情况

在这里插入图片描述

也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)

  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -XX:HeapDumpPath=./(路径)

示例代码:(这个代码是我又写的,不是那个jar里面的)

package ding;


import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class OOMTest {
    public static List<Object> list = new ArrayList<>();

    public static void main(String[] args) {
        //ArrayList<Object> list = new ArrayList<>();
        int i = 0;
        int j = 0;
        while (true){
            list.add(new User(i++, UUID.randomUUID().toString()));
            new User(j--, UUID.randomUUID().toString());
        }
    }
}

这个程序我们知道肯定会溢出,但是我们假如这两个参数,在快溢出的时候会导出一个快照文件。

现在来验证一下,首先配置一下,把内存设置的小一点,方便他溢出

-Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dump

在这里插入图片描述
运行之前D盘是没有那个jvm.dump文件的,运行之后就会产生。

在这里插入图片描述

现在我们把这个文件导入到那个jvisualvm工具中。

在这里插入图片描述
导入之后就可以看到什么类比较多,看主要是谁占的内存比较多

在这里插入图片描述

1.2 Jstack

使用jstack加进程id查找死锁,见如下示例

package ding;

public class DeadLockTest {
    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (lock1){
                System.out.println("thread1 begin");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println("thread1 end");
                }
            }
        }).start();
        new Thread(()->{
            synchronized (lock2){
                System.out.println("thread2 begin");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println("thread2 end");
                }
            }
        }).start();
        System.out.println("main thread end");
    }
}

在运行的时候能看到程序一直在运行,但是不动,发生了死锁。

在这里插入图片描述

这个时候就可以使用jstack命令去看到底是怎么回事。

查询一下进程号

在这里插入图片描述

这个时候就可以看到详细信息

在这里插入图片描述

  • “Thread-1” 线程名

  • prio=5 优先级=5

  • tid=Ox000000001fa9e000 线程id

  • nid=Ox2d64 线程对应的本地线程标识

  • nidjava.lang.Thread.State: BLOCKED 线程状态

并且在这个详细信息里面会提示发现死锁

在这里插入图片描述
也可以使用jvisualvm也可以直接检测到死锁。我们打开这个工具他会自动识别这个进程。

立马能显示检测到死锁(我这个中间我把这个进程杀死了,重新启动的,进程id变化了一下哈,但是不影响实验)

在这里插入图片描述
点击上图右上角的线程dump可以看到详细的信息。就是和我们的那个刚才黑窗口里面的信息是一样的。

1.3 远程连接jvisualvm

启动普通的jar程序JMX端口配置:

java ‐Dcom.sun.management.jmxremote.port=8888Djava.rmi.server.hostname=192.168.50.60Dcom.sun.management.jmxremote.ssl=falseDcom.sun.management.jmxremote.authenticate=false ‐jar microservice‐eureka‐server.jar

PS:

  • -Dcom.sun.management.jmxremote.port 为远程机器的JMX端口
  • -Djava.rmi.server.hostname 为远程机器IP

tomcat的JMX配置:在catalina.sh文件里的最后一个JAVA_OPTS的赋值语句下一行增加如下配置行

JAVA_OPTS=“$JAVA_OPTS ‐Dcom.sun.management.jmxremote.port=8888Djava.rmi.server.hostname=192.168.50.60Dcom.sun.management.jmxremote.ssl=falseDcom.sun.management.jmxremote.authenticate=false

连接时确认下端口是否通畅,可以临时关闭防火墙

systemctl stop firewalld #临时关闭防火墙

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

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

相关文章

Postman工具使用

Postman 是什么 Postman 是一款 API 开发协作工具&#xff0c;它可以帮助你测试和开发 API&#xff0c;Postman 提供了测试 API 的友好界面和功能&#xff0c;使用简单便捷&#xff0c;安全可靠。Postman 是每一位前后端开发者必掌握的开发工具。 如何安装 Postman 官网安装…

【Linux】Apache 网页安全优化与日志分割

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Apache 网页安全优化与日志分割 一、网页安全优化1.Apache 网页压缩2.Apache 网页缓存3.Apache 隐藏版本信息4.Apache 防盗链 二、rotatelogs 分割1.修改apache服务的主配置文…

chatgpt赋能python:Python图片保存及优化SEO的方法

Python图片保存及优化SEO的方法 对于一个网站&#xff0c;图片占据了网页中的很大一部分&#xff0c;因此如何在保证图片质量不失真的情况下&#xff0c;保证网页加载速度的快速呈现&#xff0c;是很多网站开发者需要考虑的一点。 在使用Python进行网站开发时&#xff0c;如何…

git基础教程(18)git stash暂存本地修改

文章目录 git stash pushgit stash listgit stash popgit stash applygit stash showgit stash drop 序号git stash cleargit stash pop冲突解决git stash 命令是 Git 中一个非常实用的命令,它可以让开发者暂时存储当前工作区的内容而不必提交代码或创建新分支,得到一个干净的…

Redisson分布式锁使用

一、使用 RedisTemplate 操作分布式锁 原子加锁&#xff08;uuid Value过期时间&#xff09;原子解锁(lua脚本)加长过期时间 UUID &#xff1a;让锁区分&#xff0c;防止错删其他锁设置锁过期时间&#xff1a;当业务异常导致无法释放锁形成锁死&#xff0c;设置过期时间自动释…

【机器学习】集成学习(实战)

集成学习&#xff08;实战&#xff09; 目录 一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、集成算法的基本思想三、集成算法的简单实现&#xff1a;硬投票与软投票1、构建测试数据集2、硬投票3、软投票 四、集成学习&#xff1a;Bagging …

chatgpt赋能python:Python图片定位:优化SEO的关键技术

Python图片定位&#xff1a;优化SEO的关键技术 在现代搜索引擎优化中&#xff0c;图片已成为吸引用户眼球和提升网站排名的关键元素之一。而Python作为一种功能强大的编程语言&#xff0c;在图片定位和SEO优化方面也具备很大的优势。 Python图片定位的基本原理 在Python中&a…

JAVA中.equals()与 ==的区别

1. “”是运算符&#xff0c;如果是基本数据类型&#xff0c;则比较存储的值&#xff1b;如果是引用数据类型&#xff0c;则比较所指向对象的地址值。 2..equals() equals是Object的方法&#xff0c;比较的是所指向的对象的地址值&#xff0c;一般情况下&#xff0c;重写之后比…

(五)Langchain PGVector 补充智能客服匹配式问答

文章目录 资料背景目标FAQ-匹配式问答安装PGVector 向量数据库text2vec-large-chineseLangchain-PGVector测试向量化文本写入QA问答对特别注意问题langchain pgvector表和数据相识性问题匹配 结论 资料 NLP领域五大QA问答场景总结&#xff1a;FQA、DOC-QA、KBQA、TableQA、Tas…

html+css+js实现的web小案例

上完了Web开发基础的课程之后&#xff0c;做了这么一个小案例作为课程的大作业。这个案例是静态页面&#xff0c;使用的技术有htmlcssjs&#xff0c;主要的知识点有页面的打开关闭、页面跳转、超链接、图片和音频的使用、轮播图、js函数等等。本案例的主要内容是注册、登陆之后…

PostgreSQL清理dead tuples(vacuum和vacuum full)

前言 PostgreSQL的并发控制&#xff0c;采用MVCC&#xff08;多版本并发控制&#xff09;进行处理。这种机制有一个缺点&#xff1a;随着时间的推移&#xff0c;数据文件中积累的dead tuples&#xff08;死数据/死元组&#xff09;会越来越多。 在清理dead tuples时&#xff…

redis第五第六章-redis并发缓存架构和性能优化

一、缓存设计 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去了缓存…

高通 Camera HAL3:添加一个Feature

一.概述 以HDR Feature为例&#xff0c;在CamX中添加一个新的Feature 从上游stream(upstream) feature获取格式P010的多帧数据作为inputpipeline(SWMFMergeYuv)运行算法生成同样格式的单帧数据作为输出&#xff0c;发送给下游stream(down stream) feature 二.添加 2.1 从Feat…

自动计算图片的宽度和高度拉伸至全屏附CSS及VUE简单实现

1、简介 场景&#xff1a;比如说APP封面等特点&#xff1a;能够自动适应设备的宽高&#xff0c;保证图片100%显示&#xff0c;不会缺失或者留边&#xff0c;但有可能会变形。 2、实现 注意以下代码尽管是在Vue环境下实现的&#xff0c;但与Vue关系不大&#xff0c;代码本身也足…

【Python】列表 List ④ ( 插入操作 / 追加操作 | 列表插入操作 List#insert | 列表追加元素操作 List#append )

文章目录 一、列表插入操作1、List#insert 函数简介2、代码示例 - 列表插入元素 二、列表追加元素操作1、List#append 函数简介2、代码示例 - 列表追加元素 一、列表插入操作 1、List#insert 函数简介 Python 列表 通过调用 List#insert 函数 插入元素 , 该函数需要传入两个参数…

chatgpt赋能python:Python商场打折问题详解

Python商场打折问题详解 在商场营销策略中&#xff0c;打折是一种常见的手段。而Python作为一种广泛应用于数据科学和机器学习的编程语言&#xff0c;也可以用来解决商场打折问题。本文将介绍Python实现商场打折的方法和步骤&#xff0c;希望能对广大商场营销人员和数据科学家…

C语言——数据在内存中的存储(未完待续)

文章目录 一、数据类型的介绍1.0、有符号跟无符号计算原理在这里插入图片描述1.1、数据类型的基本分类 二、整形与浮点型在内存中的存储1.整型1.0、大小端的介绍 2.原码、反码、补码2.0、原码2.1、反码2.2、补码2.3、补码转原码第二种方法 三 、浮点型3.0、浮点数存储的例题&am…

20230604给coolpi4b开发板刷机的LOG

20230604给coolpi4b开发板刷机的LOG 2023/6/4 23:49 IMG I:\BaiduNetdiskDownload\20230317[在线刷机]-RKDevTool专用镜像 I:\BaiduNetdiskDownload\20230317[在线刷机]-RKDevTool专用镜像\Windows驱动程序\DriverAssitant_v5.12.zip I:\BaiduNetdiskDownload\20230317[在线…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(三)(共识网络分析-第三步-共识模块与特异模块相关联)

1写在前面 有小伙伴子留言问最近介绍的WGCNA共识网络的意义是什么&#xff0c;保守性吗&#xff01;&#xff1f;&#x1f9d0; 与把雄性小鼠和雌性小鼠的数据merge在一起&#xff0c;一起构建网络、确定模块的方式有什么区别呢&#xff01;&#xff1f;&#x1f617; 其实区别…

JavaSE进阶(day13,复习自用)

单元测试、反射、注解、动态代理 单元测试单元测试概述单元测试快速入门单元测试常用注解 反射反射概述反射获取类对象反射获取构造器对象反射获取成员变量对象反射获取方法对象反射的作用-绕过编译阶段为集合添加数据反射的作用-通用框架的底层原理 注解注解概述自定义注解元注…