实战jvisualvm
在上一次【https://www.cnblogs.com/webor2006/p/10629889.html】已经编写了一个能在堆空间出现内存溢出的代码,先来回顾一下:
其中咱们给JVM配置了如下参数:
其中还设置了一个当发生内存溢出时来将内存的信息给dump出来,其实就类似于Android中来分析内存也是需要dump内存信息一样,如下:
其dump出来的文件在这个目录之下:
其实这个dump出来的文件也叫做“转储”文件,那用何工具来分析呢,有很多工具可以分析,这里学习一下之前也介绍的jvisualvm,它是由oracle基于hospot虚拟机力推的一个集大成者的一个功能超级强大的图形化分析工具,它是集成了很多的命令行的工具使得我们在一个GUI上看到不管是正在运行的JVM进程的种种信息,包括线程的信息、元空间的信息,堆空间的信息等等,还可以分析我们dump出来的转储文件,所以咱们先来打开此工具,在命令行中输入:
接下来咱们来打开转储文件:
接下来就详细来分析一下该转储文件:
堆转储上的线程:"main" prio=5 tid=1 RUNNABLEat java.lang.OutOfMemoryError.<init>(OutOfMemoryError.java:48)at java.util.Arrays.copyOf(Arrays.java:3210)Local Variable: class java.lang.Object[]at java.util.Arrays.copyOf(Arrays.java:3181)Local Variable: java.lang.Object[]#301at java.util.ArrayList.grow(ArrayList.java:265)at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)at java.util.ArrayList.add(ArrayList.java:462)Local Variable: com.jvm.memory.MyTest1#64646at com.jvm.memory.MyTest1.main(MyTest1.java:11)Local Variable: java.util.ArrayList#7"Finalizer" daemon prio=8 tid=3 WAITINGat java.lang.Object.wait(Native Method)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)Local Variable: java.lang.ref.ReferenceQueue#26at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:212)Local Variable: java.lang.System$2#1"Signal Dispatcher" daemon prio=9 tid=4 RUNNABLE"Reference Handler" daemon prio=10 tid=2 WAITINGat java.lang.Object.wait(Native Method)at java.lang.Object.wait(Object.java:502)at java.lang.ref.Reference.tryHandlePending(Reference.java:191)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
可以清晰的看到线程的具体异常信息,其中OutOfMemoryError异常如果在真实项目中出现了肯定就是大问题了,对于它其实都比较熟悉了,还是来瞅一下它的官方对它的解释:
其中该异常的继承体系如下 :
好,再回到jvisualvm,目前咱们是在这个视图上看到的信息:
接着来切换到类瞅一下:
好,接下来再来看另外一个视图:
也就是说需要在类视图中来选择要查看的实例数,所以咱们回到类视图来操作一下:
此时就可以自动跳到实例数这个视图了,如下:
而在实例数视图左侧看到有个500个实例的提示:
貌似跟我们在类似图看到个数不一样啊:
其实不是500个,还有其它木有展开而已,如下:
接着点击一下其中的实例,在右侧可以看到具体的字段信息,如下:
然后还能看到类加载器相关的信息,很显然我们自己创业的类是由应用类加载器所加载的:
接着还可以看一下它的父加载器,很显然是由扩展类加载器加载的:
而它的父加载器很显然就是根类加载器,也就是null嘛:
进一步对咱们之前学习的类加载器相关的知识进行巩固,好,再看最后一下视图:
接下来咱们再来改造一下我们的程序:
咱们先来看一下gc()方法的官方解释:
它最终调用的是System类中的gc(),如下:
咱们再来瞅下它的gc()注释:
从上面的解释也就说明了为啥在实际项目中不鼓励手动去调这个gc()方法,咱们这样做目的是为了学习研究仅此而已,当手动调用了gc()之后程序内部发生了啥变化呢?这里还是借用jvisualvm来查看下,首先找到咱们运行的进程:
然后双击打开它:
也有几个视图,咱们一个个来瞅下,先来看下监视:
可见是实时对进程的情况进行监视的,咱们细看一下:
接下来再切一个视图:
然后再切另外一个视图:
最后一个视图是用来分析性能的:
大致了解下既可,这里我们从jvisualvm的分析中可以发现我们的程序在堆中的使用基本是维持在2MB左右的,如下:
那。。如果我们手动将JVM的堆内存由目前的5MB改成1MB呢,看我们程序虽说主动调用了gc()看是否还会有溢出出现,试一下:
其实很容易理解,我们设置的堆内存是在1MB,而实际我们程序堆内存会在2MB左右,当然会溢出啦。
转载于:https://www.cnblogs.com/webor2006/p/10646305.html
实战jvisualvm相关推荐
- JVM 调优实战--jvisualvm远程连接使用教程
jvisualvm远程连接 使用Java自带的jvisualvm调试Java程序,可以查看CPU.内存.类及线程等信息,还可以进行Dump,无疑是一个利器 由于客户端是Windows.服务端是Linu ...
- 内存溢出_JVM|03内存溢出实战
实战 内存溢出定位与分析 环境搭建 /** * 模拟测试插入一百万条字符串[image.png](https://img.hacpai.com/file/2019/08/image-dd10de62. ...
- JVM从入门到精通(八):JVM调优实战
案例1:系统CPU经常100%,如何调优? 推理过程是:CPU100%,那么一定有线程在占用系统资源,所以 找出哪个进程cpu高(top命令) 该进程中的哪个线程cpu高(top -Hp) 如果是ja ...
- java内存溢出分析工具:jmap使用实战
java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路 ...
- visualvm远程监控jvm_大型企业JVM实战:优化及面试热点分析
本次课程的笔记非常多,而且内容已经整理了好几个小时了,接着下来内容也会更多,也是大型企业JVM性能调优实战的最后一节,希望对你有帮助! 04:JVM性能监控与故障处理工具 大型企业JVM性能调优实战之 ...
- 《RabbitMQ 实战指南》第五章 RabbitMQ 进阶(下)
<RabbitMQ 实战指南>第五章 RabbitMQ 进阶(下) 文章目录 <RabbitMQ 实战指南>第五章 RabbitMQ 进阶(下) 一.持久化 二.生产者确认 1 ...
- java内存溢出模拟_模拟实战排查堆内存溢出(java.lang.OutOfMemoryError: Java heap space)问题...
前言: 模拟实战中排查堆内存溢出(java.lang.OutOfMemoryError: Java heap space)的问题. 堆内存溢出的原因:一般都是创建了大量的对象,这些对象一直被引用着,无 ...
- jvm调优五:jvm调优工具和调优实战
jvm调优工具和调优实战 jvm自带常用命令 JPS jps是用于查看有权访问的hotspot虚拟机的进程id. 当未指定hostid时,默认查看本机jvm进程id -l:输出完整jar名称 -v:输 ...
- 性能调优-------(六)内存使用率高,5分钟如何快速排查问题(真实场景实战图文讲解)
零.总结: 本次问题通过分析,由于平时70%+的内存使用率,目前达到88%是由于5个月系统未重新发布内存数据和缓存不断增加以及堆内存的增加累计达到了内存使用率的报警阀值88%. 那么平时如果出现内存使 ...
- Zabbix监控实战-Tomcat监控
八.Zabbix监控实战-Tomcat监控 1.方法一:开发java监控页面 [root@qfedu.com tomcat8_1]# cat /application/tomcat/webapps/m ...
最新文章
- Linux中crontab定时执行python程序
- How to deal with large number of threads in clients
- PHP反序列化—构造POP链
- AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行
- 字符串类型的数字比较大小_Python核心知识系列:数字与字符串类型
- linux的常用操作——lftp、nfs、ssh和scp
- Windows Service Application Overview
- python连载第12篇 for循环 源码+ 答案
- 使用Aspose.Cell for Java操作Excel(已去除水印)
- Java Web GenericServlet
- Xshell5免费版安装使用说明
- 信捷XC PLC与施耐德ATV12变频器通讯程序
- 无痛学习ISAC(三)
- 【实战篇】微信公众号网页授权登录实现起来如此简单
- malloc失败的一个原因
- 学习笔记——共阳数码管的静态显示
- 本科学历马斯克当选美国工程院院士!张宏江、萨蒂亚:“我们都有美好的未来”...
- 还有哪些不错的正规Java培训机构
- SN74LVC4245A/(74LVC245) 真是个好东西啊
- pacman的常用命令
热门文章
- dell自带的测试软件,Dell System Detect
- 基于java社区疫情防控管理系统(java毕业设计)
- fluent并行 linux_fluent并行计算命令
- 云原生日志管理瑞士军刀 Fluent Operator 中文入门教程
- BEA Tuxedo中间件应用初探
- 普林斯顿微积分读本篇一:函数
- Glide 加载圆角图片(解决设置圆角后和centerCrop冲突的问题)
- 算法分析与设计-线性时间选择详解(通俗易懂,含图解,附源码)(c++)
- win10电脑桌面透明便签_win10桌面透明悬浮便签怎么常驻桌面
- 常见计算机蓝屏代码,常见电脑蓝屏代码大全