一,jvisualVM介绍

jvisualVM是一款jdk自带的图像化jvm性能监控工具,可以:

  • 实时监控堆内存的变化情况
  • 一键生成堆转储文件并解析并图形化展示
  • dump线程信息(相当于jstack)
  • 堆内存profiler(相当于jmap -histo展示堆内对象直方图)
  • CPU、内存、线程、已加载的类统计

二,实时监控堆内存使用情况

很棒的一点是,这个图是动态变化的,可以动态的看见堆内存各区域的动态变化:

  • eden区内存占用逐渐增多
  • eden区垃圾回收
  • eden区对象复制到幸存区
  • 幸存区对象复制到老年代
  • full gc
  • ygc的统计数据
  • fgc的统计数据

使用案例:

生产环境服务器处理业务请求变慢,通过jvisualVM发现ygc的次数非常频繁,没发生fgc,老年代的空间非常充足,以上现象说明eden区的空间小,但是这台机器的内存是32G,不至于缺乏内存,从jvisualVM上看,可用的eden区内存高达3G。那为什么会频繁的ygc呢?

仔细研究发现,虽然eden区的可用内存也即最大可分配内存高达3G,但实际分配给eden区的内存只有150M,难怪ygc那么频繁。

那为什么只分配给eden区150M内存呢,继续观察发现old区的分配内存也没有想象中的多,但是old区在不断的动态调整,不断扩大,eden区的实际分配内存基本没有变化。

心里大致有底了,检查了下jvm参数,发现没有配置-Xms、-Xmx,在没有明确指定堆内存的大小的情况下,jvm会根据应用所需要的最小堆内存进行内存规划,导致了eden区过小。

定位到了这个问题,就知道该怎么办了,显式配置-Xms8g、-Xmx8g,重启应用,ygc明显减少,应用吞吐量大幅增加,一次成功的jvm优化。

这里需要清楚jvisualVM的visual gc界面的使用,visual gc是jvisualVM的插件,要先安装,安装极其简单,通过jvisualVM即可快速完成。

visual gc界面详解:

关键要理解eden可用大小和实际分配大小,如果不通过-Xms、-Xmx明确指定堆空间大小的话,eden可用大小和实际分配大小可能会有很大差距,导致eden区频繁发生ygc。

三, 一键生成堆转储文件并解析并图形化展示

1,生成dump文件

2,自带解析并可视化

可以通过实例数找到大对象和大集合对象 ,以及通过“与另一个堆转储进行比较”确定不同时间点上对象在堆内存的变化情况,结合实际情况根据这些线索进一步确定问题所在。

MAT是更强大的dump文件分析工具,如果说有必须要掌握的图形化jvm监控工具的话,jvisualVM和MAT是唯二两款。

后面再分析MAT的使用。

四,dump线程信息(相当于jstack)

1,生成线程信息

2,查看生成的线程相关信息

查看线程状态及各状态持续时间。

可惜的是,不能搜索,生成环境几十上百个线程,不能搜索就代表着鸡肋。

案例:定位C3P0连接池满导致应用阻塞,响应缓慢

thread2一直被阻塞,直接原因是线程池连接数全部被占用,连接池被用完有如下几个可能:

  • 连接池数设置过少
  • sql执行慢,导致连接长时间被占用
  • 连接使用完成后未被释放
  • 数据库异常,如锁表

解决方案:
1,加大连接池数量;
2,修改代码,使用完连接后要关闭连接;
3,优化sql,提升sql执行性能;

jvisualVM调优案例相关推荐

  1. jvm调优思路及调优案例

    我们说jvm调优,其实就是不断测试调整jvm的运行参数,尽可能让对象都在新生代**(Eden)**里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小, ...

  2. Jvm 系列(六):Java 服务 GC 参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  3. Java服务GC参数调优案例

    这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题.我个人特别喜欢这种实战类的内容,经原作者的授权同意,将文章分享于此.原文链接:Java服务GC参数调优案例,下面为 ...

  4. JVM调优思路、订单秒杀jvm调优案例

    文章目录 1. jvm调优思路 2. 订单的秒杀模块jvm调优案例 1. jvm调优思路 jvm调优其实更多的是对GC的优化,尤其是尽量减少full GC. 大多数情况下,对象在Eden区分配,当Ed ...

  5. c++游戏开发案例源代码_1人开发千万下载,爆款游戏TENKYU调优案例

    随着全球休闲游戏市场的爆发,越来越多的研发发行转向休闲游戏赛道.当入局的厂商越来越多,买量能力不再是决定产品成败的关键因素,未来产品品质将更为重要,所以产品调优的能力将成为重中之重.今天给大家分享一个 ...

  6. JVM的STW(stop the world)机制及调优案例

    STW(stop the world)是什么 1.stop the world指的是GC事件发生过程中,会产生应用程序的停顿.停顿产生时整个应用程序线程都会被暂停,没有任何响应, 有点像卡死的感觉,这 ...

  7. 线上FGC调优案例三则

    前言 闲鱼服务端应用广泛使用 Java 技术栈,基于JVM提供的托管式堆内存管理,开发者无需过多关心对象创建/回收时的内存分配/释放动作,垃圾回收器(Garbage Collector)会在需要的时候 ...

  8. JVM从入门到精通(七):GC常用参数,Method Area,JVM调优案例分析

    GC常用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间 -XX:+UseTLAB 使用TLAB,默认打开 -XX:+PrintTLAB 打印TLAB的使用情况 -XX:T ...

  9. 《深入理解JVM.2nd》笔记(五):调优案例分析与实战

    文章目录 概念 案例分析 高性能硬件上的程序部署策略 情景再现1 问题分析1 关于Full GC 使用64位JDK来管理大内存可能遇到问题 建立逻辑集群 使用逻辑集群可能遇到的问题 最后解决方案 集群 ...

  10. 【华为云技术分享】Nginx应用调优案例

    1 问题背景 nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优. 2 原因分析 l  网卡配置 该应用场景下网络吞吐量大,网卡的配置能对性能提升起到很大 ...

最新文章

  1. C++11 新特性之std::thread
  2. Quartz.net官方开发指南 第九课: JobStore
  3. IT从业的迷思与破解之道(更新)
  4. laravel5 centos6.4下的配置体验
  5. redis 哨兵 异步_突破Java面试(23-8) - Redis哨兵主备切换的数据丢失问题-阿里云开发者社区...
  6. 日文邮件变成乱码解决方案
  7. kali安装后的基本配置
  8. 五大智能软硬件技术,赋予智慧健康无限可能
  9. 萌新的Python练习实例100例(六)斐波那契数列
  10. 逻辑回归之,sigmoid ,交叉熵
  11. eclipse 创建springboot 提示socket time超时问题
  12. Android NotificationManager详解
  13. 有哪些将英文文献翻译为中文的网站或软件?
  14. Python网络爬虫数据采集实战:基础知识
  15. 如何在 Next.js 中实现重定向
  16. WorldFirst万里汇推出港币和离岸人民币账户!
  17. JavaSE进阶篇【6】——2022年7月2日
  18. 好久没来,深夜来一发
  19. 【电路】电容(二)——滤波电容
  20. 计算机用户被停用,电脑教程:Windows7用户被停用解决方法

热门文章

  1. 用51单片机和esp8266实现通过手机app控制单片机小灯
  2. (Kinetisnbsp;K60)WDOG看门狗测试
  3. java+整合handwrite_Java
  4. 微软内部补丁(非正式发布)之取得方式(20110713)
  5. 一些好用的开源监控工具汇总
  6. win8普通版连接远程桌面---RDPWrap
  7. 《headfirst设计模式》读书总结-包含C++代码
  8. ria技术_JavaFXpert RIA示例挑战截止日期已延长
  9. 蓝桥杯官网 试题 PREV-274 历届真题 分果果【第十二届】【省赛】【研究生组】【C++】【Java】两种解法
  10. 数据仓库与数据挖掘论文