首页 文章 精选 留言 我的

精选列表

搜索[前端性能],共10000篇文章
优秀的个人博客,低调大师

Java性能调优:利用VisualVM进行性能分析

来源:https://www.cnblogs.com/xifengxiaoma/p/9402497.html作者:朝雨忆轻尘 ❞ JVisualVM 简介 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。 VisualVM 提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序或远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。 双击启动 jvisualvm.exe,启动起来后和jconsole 一样同样可以选择本地和远程,如果需要监控远程同样需要配置相关参数。 主界面如下: VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等。 如何安装: 从主菜单中选择“工具”>“插件”。 在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。 逐步完成插件安装程序。 我这里以 Eclipse(pid 22296)为例,双击后直接展开,主界面展示了系统和jvm两大块内容,点击右下方jvm参数和系统属性可以参考详细的参数信息. 因为VisualVM的插件太多,我这里主要介绍三个我主要使用几个:监控、线程、Visual GC 监控的主页其实也就是,cpu、内存、类、线程的图表 线程和jconsole功能没有太大的区别 Visual GC 是常常使用的一个功能,可以明显的看到年轻代、老年代的内存变化,以及gc频率、gc的时间等。 以上的功能其实jconsole几乎也有,VisualVM更全面更直观一些,另外VisualVM非常多的其它功能,可以分析dump的内存快照,dump出来的线程快照并且进行分析等,还有其它很多的插件大家可以去探索 案例分析 准备模拟内存泄漏样例 定义静态变量HashMap 分段循环创建对象,并加入HashMap importjava.util.HashMap;importjava.util.Map;publicclassCyclicDependencies{//声明缓存对象privatestaticfinalMapmap=newHashMap();publicstaticvoidmain(Stringargs[]){try{Thread.sleep(10000);//给打开visualvm时间}catch(InterruptedExceptione){e.printStackTrace();}//循环添加对象到缓存for(inti=0;i<1000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("first");//为dump出堆提供时间try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<1000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("second");try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<3000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("third");try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<4000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("forth");try{Thread.sleep(Integer.MAX_VALUE);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("qqqq");}} 配置jvm参数如下: -Xms512m -Xmx512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=50m 运行程序并打卡visualvm监控 使用JVisualVM分析内存泄漏 查看Visual GC标签,内容如下,这是输出first的截图 这是输出forth的截图: 通过2张图对比发现: 老生代一直在gc,当程序继续运行可以发现老生代gc还在继续: 增加到了7次,但是老生代的内存并没有减少。说明存在无法被回收的对象,可能是内存泄漏了。 如何分析是那个对象泄漏了呢? 打开抽样器标签:点击后如下图: 按照程序输出进行堆dump,当输出second时,dump一次,当输出forth时dump一次。 进入最后dump出来的堆标签,点击类: 比较结果如下: 可以看出在两次间隔时间内TestMemory对象实例一直在增加并且多了,说明该对象引用的方法可能存在内存泄漏。 如何查看对象引用关系呢? 右键选择类TestMemory,选择“在实例视图中显示”,如下所示: 左侧是创建的实例总数,右侧上部为该实例的结构,下面为引用说明,从图中可以看出在类CyclicDependencies里面被引用了,并且被HashMap引用。 如此可以确定泄漏的位置,进而根据实际情况进行分析解决。 JVisualVM 远程监控 Tomcat 修改远程tomcat的catalina.sh配置文件,在其中增加: JAVA_OPTS="$JAVA_OPTS-Djava.rmi.server.hostname=192.168.122.128-Dcom.sun.management.jmxremote.port=18999-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false" 打开jvisualvm,右键远程,选择添加远程主机: 输入主机的名称,直接写ip,如下: 右键新建的主机,选择添加JMX连接,输入在tomcat中配置的端口即可。 双击打开。完毕! 参考资料 https://blog.csdn.net/kl28978113/article/details/53817827 https://www.cnblogs.com/ityouknow/p/6437037.html 如果本文对你有帮助, 别忘记给我个三连: 点赞,转发,评论 。 咱们下期见! 收藏等于白嫖,点赞才是真情! End 干货分享 这里为大家准备了一份小小的礼物,关注公众号,输入如下代码,即可获得百度网盘地址,无套路领取!001:《程序员必读书籍》002:《从无到有搭建中小型互联网公司后台服务架构与运维架构》003:《互联网企业高并发解决方案》004:《互联网架构教学视频》006:《SpringBoot实现点餐系统》007:《SpringSecurity实战视频》008:《Hadoop实战教学视频》009:《腾讯2019Techo开发者大会PPT》 010:微信交流群 近期热文top 1、关于JWT Token 自动续期的解决方案 2、还不了解ETL,看看这篇文章? 3、为什么微服务需要api网关 4、架构师之路-微服务技术选型 5、RocketMQ进阶-事务消息 我就知道你“在看” 本文分享自微信公众号 - JAVA日知录(javadaily)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

前端必备:FrontendBlocks 3.9 版本重磅发布

重磅更新内容(划重点):可以支持相似块的class合并了,生成的css代码行数最高可降95%! 对于大家的使用反馈我非常重视,所以在改了两个小版本之后又用几个项目实测了近一年,这回终于正式发布3.9版本。 赶快发挥你对弹性布局的理解和设计才华吧!高度还原设计稿必备! 更新内容: 1、智能父子连字符关联:支持CSS名称连字符的父子关系关联,生成产物的命名更加省心 我们可以用连字符命名各个块,并且支持在块中嵌套块,这样我们就可以很方便的实现复杂的页面布局。 比如icon-btn,下面分别有icon-btn-image和icon-btn-text两个子元素, 那么在生成的时候会自动生成下面的这种代码: <div class="icon-btn" onclick="iconBtnClick()"> <img class="image"/> <div class="text">图标文字</div> </div> <style> .icon-btn{ box-sizing:border-box; border-bottom:1px solid rgba(229, 229, 229, 1); border-right:1px solid rgba(229, 229, 229, 1); text-align:left; display:flex; position:relative; height:92px; width:33%; flex-direction:column; justify-content:center; align-items:center; } .icon-btn{ user-select: none; } .icon-btn:hover{ opacity: 0.8; } .icon-btn:active{ opacity: 0.5; } .icon-btn>.image{ background-image:url(https://www.yumeisoft.com/demo-icon.jpg); background-size:cover; background-repeat:no-repeat; background-position:center; text-align:left; width:32px; height:32px; } .icon-btn>.text{ font-size:14px; color:rgba(102, 102, 102, 1); text-align:left; display:flex; position:relative; width:100%; flex-direction:column; align-items:center; } </style> 2、智能CSS精简:精简了生成的CSS代码,原来数千行的代码现如今只需几十行。对于结构相同并且所有子元素样式一模一样的,不会再生成新的block样式,而是直接复用之前的样式。 3、对于名称为-btn、-button结尾的元素自动加上点击效果,并且自动添加点击事件,写业务代码更方便,生成完几乎直接就可以开写! 4、增加了7个常用模板,可以更快速的构建布局。 5、极速设置面板里增加了一键“设置随机占位图”按钮,立即就能给当前块加背景,快速获得图文并茂的效果。 6、重写了导出vue和html的代码,现在导出规则已经和ToolsBar解耦,你可以更方便的写你想要的任何导出规则。 7、导出界面增加了一键复制功能,粘贴到代码里就能用!更贴心。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册