上周该文优选 :
《JavaGuide 复试狙击版》 5.0 正式版浏览Spring 6.0 备受瞩目正式发布!最高全力支持 Java 17 !!华大基因 Java 后端 SSP,夺下!!工作二十年,聘用新公司不出五个月就碰到裁减NLP 转后端合作开发,成功领到二进制应聘 offer!!银行为何要以重要信息技术岗圣索弗勒维孔特接着让人干一年行员?Java复试手册中文网站:javaguide.cn
书名:https://www.cnblogs.com/xifengxiaoma/p/9402497.htmlVisualVM 是 Netbeans 的 profile 农健,已在JDK6.0 update 7 中便携式,能监视缓存,缓存情况,查看形式的 CPU 时间和缓存中的对 象,已被 GC 的第一类,逆向查阅重新分配的栈(如 100 个 String 第一类分别由赫卡泰奥斯第一类重新分配出来的)。在JDK_HOME/bin(预设是C:\Program Files\Java\jdk1.6.0_13\bin)产品目录上面,有两个jvisualvm.exe文档,holds关上,从 UI 上上看,这个应用软件是如前所述 NetBeans 合作开发的了。
VisualVM 提供更多了一个可光晕面,用作查阅 Java 软件包上运转的如前所述 Java 技术的插件的详细资料。VisualVM 对 Java Development Kit (JDK) 辅助工具所索引的 JVM 应用软件相关统计数据进行组织机构,并通过一种使您能加速查阅相关数个 Java 插件的统计数据的形式提供更多该重要信息。
您能查阅邻近地区插件或远距PS3上运转的插件的相关统计数据。除此之外,还能捕捉相关 JVM 应用软件示例的统计数据,并将该数据留存到邻近地区控制系统,德博瓦桑县中后期查阅或与浏览者共享资源。
holds开启 jvisualvm.exe,开启起来后和 jconsole 一样反之亦然能优先选择邻近地区和远距,如果须要监视远距反之亦然须要实用性相关模块。
主介面如下表所示:
Vi
如何安装:
从主菜单中优先选择“辅助工具”>“插件”。在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。逐步完成插件安装程序。我这里以 Eclipse(pid 22296)为例,holds后直接展开,主介面展示了控制系统和 jvm 两大块内容,点击右下方 jvm 模块和控制系统属操控性参考详细的模块重要信息.
因为 VisualVM 的插件太多,我这里主要介绍三个我主要使用几个:监视、缓存、Visual GC
监视的主页其实也就是,cpu、缓存、类、缓存的图表
缓存和 jconsole 功能没有太大的区别
Visual GC 是常常使用的两个功能,能明显的看到年轻代、老年代的缓存变化,以及 gc 频率、gc 的时间等。
以上的功能其实 jconsole 几乎也有,VisualVM 更全面更直观一些,另外 VisualVM 非常多的其它功能,能分析 dump 的缓存快照,
dump 出来的缓存快照并且进行分析等,还有其它很多的插件大家能去探索
案例分析
准备模拟缓存泄漏样例
1、定义静态变量 HashMap
2、分段循环创建第一类,并加入 HashMap
代码如下表所示:
importjava.util.HashMap;
importjava.util.Map;
public class CyclicDependencies{
//声明缓存第一类 private static final Map map = newHashMap();
public static void main(String args[]){
try{
Thread.sleep(10000);//给关上visualvm时间 } catch(InterruptedException e) {
e.printStackTrace();
}
//循环添加第一类到缓存 for(int i=0; i<1000000;i++){
TestMemory t = newTestMemory();
map.put(“key”+i,t);
}
System.out.println(“first”);
//为dump出堆提供更多时间 try{
Thread.sleep(10000);
} catch(InterruptedException e) {
e.printStackTrace();
}
for(int i=0; i<1000000;i++){
TestMemory t = newTestMemory();
map.put(“key”+i,t);
}
System.out.println(“second”);
try{
Thread.sleep(10000);
} catch(InterruptedException e) {
e.printStackTrace();
}
for(int i=0; i<3000000;i++){
TestMemory t =newTestMemory();
map.put(“key”+i,t);
}
System.out.println(“third”);
try{
Thread.sleep(10000);
} catch(InterruptedException e) {
e.printStackTrace();
}
for(int i=0; i<4000000;i++){
TestMemory t = newTestMemory();
map.put(“key”+i,t);
}
System.out.println(“forth”);
try{
Thread.sleep(Integer.MAX_VALUE);
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(“qqqq”);
}
}
3、实用性 jvm 模块如下表所示:
-Xms512m
-Xmx512m
-XX:-UseGCOverheadLimit
-XX:MaxPermSize=50m
4、运转程序并打卡 visualvm 监视
使用 JVisualVM 分析缓存泄漏
1、查阅 Visual GC 标签,内容如下表所示,这是输出 first 的截图
这是输出 forth 的截图:
通过 2 张图对比发现:
老生代一直在 gc,当程序继续运转能发现老生代 gc 还在继续:
增加到了 7 次,但是老生代的缓存并没有减少。说明存在无法被回收的第一类,可能是缓存泄漏了。
如何分析是那个第一类泄漏了呢?关上抽样器标签:点击后如下表所示图:
按照程序输出进行堆 dump,当输出 second 时,dump 一次,当输出 forth 时 dump 一次。
进入最后 dump 出来的堆标签,点击类:
点击右上角:“与另两个堆存储对比”。如图优先选择第一次导出的 dump 内容比较:
比较结果如下表所示:
能看出在两次间隔时间内 TestMemory 第一类示例一直在增加并且多了,说明该第一类引用的形式可能存在缓存泄漏。
如何查阅第一类引用关系呢?
右键优先选择类 TestMemory,优先选择“在示例视图中显示”,如下表所示所示:
左侧是创建的示例总数,右侧上部为该示例的结构,上面为引用说明,从图中能看出在类 CyclicDependencies 里面被引用了,并且被 HashMap 引用。
如此能确定泄漏的位置,进而根据实际情况进行分析解决。
JVisualVM 远距监视 Tomcat
1、修改远距 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”
这次实用性先不走权限校验。只是关上 jmx 端口。
2、关上 jvisualvm,右键远距,优先选择添加远距PS3:
3、输入PS3的名称,直接写 ip,如下表所示:
右键新建的PS3,优先选择添加 JMX 连接,输入在 tomcat 中实用性的端口即可。
4、holds关上。完毕!
········· END ··············
👉 欢迎准备 Java 复试以及学习 Java 的同学加入我的知识星球,干货很多!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
👉 《Java 复试指北》持续更新完善中!这是一份教你如何更高效地准备复试的小册,涵盖常见八股文(控制系统设计、常见框架、分布式、高并发 ……)、优质面经等内容。
推荐阅读 :
曾经真是网瘾少年害,毕业三年了!两个普通程序员的周末历和一件“大事”简单聊聊我的 Java 后端合作开发求职之路👉 如果本文对你有帮助的话,欢迎 点赞&在看&分享 ,这对我继续分享&创作优质该文非常重要。非常感谢!