JVisualVM初步使用

article/2025/10/13 20:10:48

JVisualVM初步使用

1、前言

jvm调优工具有常见的为Jconsole,jProfile,VisualVM

  • Jconsole: 为jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。
  • JProfiler:商业软件,需要付费。功能强大。
  • VisualVM:JDK自带,功能强大,与JProfiler类似。其能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈等功能。

2、JVisualVM初步使用

2.1 安装

VisualVM可以进行远程和本地监控,在jdk安装目录中运行jvisualvm.exe(E:\work\Java\jdk1.8.0_321\bin ),也可以下载独立版的visual vm(下载链接地址:https://github.com/oracle/visualvm/releases/download/2.1.3/visualvm_213.zip)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EKD3slr3-1653571886037)(C:\Users\25060\AppData\Roaming\Typora\typora-user-images\image-20220526192812633.png)]

2.2 插件

可以选择安装一些自己需要的插件,菜单栏->工具->插件,选择需要安装的插件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Z7jb6vf-1653571886038)(C:\Users\25060\AppData\Roaming\Typora\typora-user-images\image-20220526210623662.png)]

2.3 visual Gc

比如下载的visual gc插件,可以跟踪gc的情况,分析后可以更好配置jvm参数

在这里插入图片描述

3、远程连接

连接教程:https://blog.csdn.net/qq_44872773/article/details/122042495

坑点:https://blog.csdn.net/weixin_44906271/article/details/121373973

4、如何进行JVM调优

观察内存释放情况、集合类检查、对象树

上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能

4.1 堆信息查看

在这里插入图片描述

可查看堆空间大小分配(年轻代、年老代、持久代分配)

提供即时的垃圾回收功能

垃圾监控(长时间监控回收情况)

在这里插入图片描述

查看堆内类、对象信息查看:数量、类型等

在这里插入图片描述

对象引用情况查看

有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:

–年老代年轻代大小划分是否合理

–内存泄漏

–垃圾回收算法设置是否合理

4.2 线程监控

在这里插入图片描述

线程信息监控:系统线程数量。

线程状态监控:各个线程都处在什么样的状态下

在这里插入图片描述

Dump线程详细信息:查看线程内部运行情况

死锁检查

热点分析

img

CPU热点:检查系统哪些方法占用的大量CPU时间

内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)

这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和进行系统优化,而不是漫无目的的进行所有代码的优化。

快照

快照是系统运行到某一时刻的一个定格。在我们进行调优的时候,不可能用眼睛去跟踪所有系统变化,依赖快照功能,我们就可以进行系统两个不同运行时刻,对象(或类、线程等)的不同,以便快速找到问题

举例说,我要检查系统进行垃圾回收以后,是否还有该收回的对象被遗漏下来的了。那么,我可以在进行垃圾回收前后,分别进行一次堆情况的快照,然后对比两次快照的对象情况。

4.3 内存泄漏检查

内存泄漏是比较常见的问题,而且解决方法也比较通用,这里可以重点说一下,而线程、热点方面的问题则是具体问题具体分析了。

内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。

内存泄漏对系统危害比较大,因为他可以直接导致系统的崩溃。

需要区别一下,内存泄漏和系统超负荷两者是有区别的,虽然可能导致的最终结果是一样的。内存泄漏是用完的资源没有回收引起错误,而系统超负荷则是系统确实没有那么多资源可以分配了(其他的资源都在使用)。

4.3.1 年老代堆空间被占满

异常: java.lang.OutOfMemoryError: Java heap space

说明:

img

这是最典型的内存泄漏方式,简单说就是所有堆空间都被无法回收的垃圾对象占满,虚拟机无法再在分配新空间。

如上图所示,这是非常典型的内存泄漏的垃圾回收情况图。所有峰值部分都是一次垃圾回收点,所有谷底部分表示是一次垃圾回收后剩余的内存。连接所有谷底的点,可以发现一条由底到高的线,这说明,随时间的推移,系统的堆空间被不断占满,最终会占满整个堆空间。因此可以初步认为系统内部可能有内存泄漏。(上面的图仅供示例,在实际情况下收集数据的时间需要更长,比如几个小时或者几天)

解决:

这种方式解决起来也比较容易,一般就是根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。

4.3.2 元空间被占满

**异常:**java.lang.OutOfMemoryError: PermGen space

说明:

系统的代码非常多或引用的第三方包非常多或者通过动态代码生成类加载等方法,导致元空间的内存占用很大。

解决:

  • 优化参数配置,避免影响其他JVM进程
  • 慎重引用第三方包
  • 关注动态生成类的框架

4.3.3 堆栈溢出

  • 异常:java.lang.StackOverflowError

  • 说明:这个就不多说了,一般就是递归没返回,或者循环调用造成

线程堆栈满

异常:Fatal: Stack size too small

说明:java中一个线程的空间大小是有限制的。JDK5.0以后这个值是1M。与这个线程相关的数据将会保存在其中。但是当线程空间满了以后,将会出现上面异常。

解决:增加线程栈大小。-Xss2m。但这个配置无法解决根本问题,还要看代码部分是否有造成泄漏的部分。

4.3.4 系统内存被占满

异常:java.lang.OutOfMemoryError: unable to create new native thread

说明

这个异常是由于操作系统没有足够的资源来产生这个线程造成的。系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来创建线程。因此,当线程数量大到一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。

分配给Java虚拟机的内存愈多,系统剩余的资源就越少,因此,当系统内存固定时,分配给Java虚拟机的内存越多,那么,系统总共能够产生的线程也就越少,两者成反比的关系。同时,可以通过修改-Xss来减少分配给单个线程的空间,也可以增加系统总共内生产的线程数。

解决:

  1. 重新设计系统减少线程数量。
  2. 线程数量不能减少的情况下,通过-Xss减小单个线程大小。以便能生产更多的线程。

5、jvm参数优化建议

本质上是减少GC的次数。

如果是频繁创建对象的应用,可以适当增加新生代大小。常量较多可以增加持久代大小。对于单例较多的对象可以增加老生代大小。比如spring应用中。

GC选择,在JDK5.0以后,JVM会根据当前系统配置进行判断。一般执行-Server命令便可以。gc包括三种策略:串行,并行,并发。

吞吐量大大应用,一般采用并行收集,开启多个线程,加快gc的是否。

响应速度高的应用,一般采用并发收集,比如应用服务器。

年老代建议配置为并发收集器,由于并发收集器不会压缩和整理磁盘碎片,因此建议配置:

-XX:+UseConcMarkSweepGC #并发收集年老代

-XX:CMSInitiatingOccupancyFraction=80 # 表示年老代空间到80%时就开始执行CMS

-XX:+UseCMSCompactAtFullCollection # 打开对年老代的压缩。可能会影响性能,但是可以消除内存碎片。

-XX:CMSFullGCsBeforeCompaction=10 # 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此参数设置运行次FullGC以后对内存空间进行压缩、整理。


http://chatgpt.dhexx.cn/article/bVtIdXfW.shtml

相关文章

JVisualVM 简介

VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来…

VisualVM

VisualVM VisualVM基本认识 官网http://visualvm.github.io/ **VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。**…

JAVA性能分析工具--Jvisualvm使用方法

JDK自带的JAVA性能分析工具。它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本。点击一下jvisualvm.exe图标它就可以运行了。 这里是VisualVM 的官方网站:https://visualvm.dev.java.net,资料很全,同时提供V…

jvisualvm使用

一、jvisualvm安装 1、Java版本在1.8及1.8版本以下,JDK已经自带这个工具 2、Java版本在1.8的,需要安装visualvm https://visualvm.github.io/download.html 对于自行安装的版本,运行前需要配置一下路径 进入visualvm的etc的目录,修改visualvm.conf文件…

生成特定架构内核cscope数据库

tags代码浏览工具 tags工具介绍 一般来说,如果我们想要研究一个c/c项目的源码,我们首先要做的是为该项目生成tags文件,tags文件种类有很多,比如 ctags、etags、cscope、gtags 等,有关他们的区别可以参考下面链接里的…

Emacs+cscope手动创建索引(感受cscope的强大)(八十三)

1.cscope 创建索引 <1>.创建索引文件列表cscope.files # find . ! -path "./out/*" ! -path "./prebuilts/*" ! -path "./frameworks/*" -name "*.h" -o -name "*.c" -o -name "*.cc" -o -name "*.cp…

vim cscope java_【转】Cscope的使用(领略Vim + Cscope的强大魅力)

【转】Cscope的使用(领略Vim Cscope的强大魅力) 1、Cscope介绍 Cscope是类似于ctags一样的工具&#xff0c;但可以认为她是ctags的增强版&#xff0c;因为她比ctags能够做更多的事。在Vim中&#xff0c;通过cscope的查 询&#xff0c;跳转到指定的地方就像跳转到任何标签&…

Vim/Cscope使用

&#xff1a;cs find s ---- 查找C语言符号&#xff0c;即查找函数名、宏、枚举值等出现的地方 &#xff1a;cs find g ---- 查找函数、宏、枚举等定义的位置&#xff0c;类似ctags所提供的功能 &#xff1a;cs find d ---- 查找本函数调用的函数 &#xff1a;cs find c ---- 查…

Cscope的使用

首先在目录下建立cscope索引文件 find -name *.c > cscope.file cscope -Rbkq 这个命令会生成三个文件&#xff1a;cscope.out, cscope.in.out, cscope.po.out。 其中cscope.out是基本的符号索引&#xff0c;后两个文件是使用"-q"选项生成的&#xff0c;可以加快c…

Cscope的使用(领略Vim + Cscope的强大魅力)

http://blog.csdn.net/dengxiayehu/article/details/6330200 1、Cscope介绍 Cscope是类似于ctags一样的工具&#xff0c;但可以认为她是ctags的增强版&#xff0c;因为她比ctags能够做更多的事。在Vim中&#xff0c;通过cscope的查询&#xff0c;跳转到指定的地方就像跳转到任…

计算机联网记录能删除吗,电脑怎么删除路由器wifi记录

这个网络时代里面我们最常用来连接网络的设备就是路由器了&#xff0c;特别是在我们的生活中很难缺少wifi网络&#xff0c;当然我们有时候也可能会想要删除wifi网络&#xff0c;那么你知道电脑怎么删除路由器wifi记录吗?下面是学习啦小编整理的一些关于电脑删除路由器wifi记录…

mysql查询删除的数据历史记录_查询数据库各种历史记录

在SQL Server数据库中,从登陆开始,然后做了什么操作,以及数据库里发生了什么,大多都是有记录可循的,但是也有一些确实无从查起。 一.数据库启动记录 1.最近一次启动SQL Server的时间 select sqlserver_start_time from sys.dm_os_sys_info; --也可参考系统进程创建的时间,…

怎样删除计算机硬盘记录,有什么方法能删除电脑里使用过的移动硬盘的记录

第一步&#xff1a;通过硬件检测软件(EVEREST Ultimate)得到你的移动存储器的硬件编号&#xff0c;例如我的魅族E5为&#xff1a;Ven_SigmaTel&Prod_MSCN&Rev_0100\0002F68C022B070F&0。0002F68C022B070F&0为硬件编号&#xff0c;具有唯一性。 3 T* }5 {/ T3 ]…

sqlserver恢复已经删除的表记录

在发生删除操作后&#xff0c;发现要找回删除的记录&#xff0c;此时灾难发生&#xff0c;为了挽回记录&#xff0c;操作步骤如下&#xff1a; 首先保证数据恢复模式是完整的&#xff0c;然后才能做下面的操作&#xff1a; 强烈建议数据库创建之后做个完整的备份&#xff0c;…

数据库的主键ID设置为自动增加,删除记录后的记录还是递增的,如何重新从1开始增加呢?

操作 数据库数据 删除了7和8之后添加了一条新数据 问题 删除记录后的记录还是递增的&#xff0c;如何重新从1开始增加呢&#xff1f; 解决 truncate table 表名;注意 此语句会把表中数据清空

如何查看AD域账号的删除记录

**如何查看AD域账号删除记录及恢复**在日常AD域管理中&#xff0c;有时候我们不小心删除了域账号&#xff0c;或者我们想查看这个域账号是什么时候创建并删除的&#xff0c;那怎么办&#xff1f;是否可以恢复&#xff1f;其实微软本身已经为我们的账号信息做了备份机制&#xf…

计算机上网记录怎么清除,电脑浏览器上网记录怎么删除

我们使用浏览器上网时都会生成大量的缓存临时文件与访问过的url地址&#xff0c;有时为了我并不想让其它人看到我这些信息要怎么清除呢&#xff0c;下面我们一起来看看吧。 1.在这里我们只要打开浏览器&#xff0c;然后点击菜单上的“查看”->“历史记录”如下图所示(搜狗浏…

es 7.4.0 详解删除记录的方法

_delete_by_query 命令是删除记录 post 请求&#xff1a;http://localhost:9200/index/_delete_by_query 注&#xff1a; 删除也是先走和查询一样的语法&#xff0c;只是最后的命令是 删除的命令 {"query":{"term":{"bookId":1}} }这是清空 {&…

【日常实用】Git如何删除记录中某一笔提交

前言&#xff1a;好久没写了&#xff0c;最近忙于工作的项目&#xff0c;一连干了好几个月&#xff0c;几个月里面又遇到了高温、限电以及疫情种种困难&#xff0c;最终还是如期完成项目进度。今年真的是太难了&#xff0c;哈哈废话不多说&#xff0c;今天给大家介绍一下Git中的…

MySQL删除表中所有记录的方法和操作例子

从数据库中删除数据&#xff0c;使用DELETE语句。其语法如下 DELETE FROM table_name [WHERE <condition>]; 语句解析&#xff1a;table_name为表名称&#xff0c;[WHERE <condition>]为删除条件 例如如下例子&#xff1a;删除的是表admin_user_table&#xff…