官网http://visualvm.github.io/
**VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。**您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。
jvisualvm是随jdk一同发布的jvm诊断工具,通过插件可以扩展很多功能,插件扩展也是jvisualvm的精华所在。自从 JDK 6 Update 7 以后已经作为 Oracle JDK 的一部分,位于 JDK 根目录的 bin 文件夹下,无需安装,直接运行即可。
运行java程序的时候启动visualvm,方便查看jvm的情况 比如堆内存大小的分配
某个对象占用了多大的内存,jvm调优必备工具
visualvm工具使用教程
参考URL: https://blog.csdn.net/qq_23747821/article/details/79675193?utm_source=blogxgwz0
性能分析神器VisualVM
参考URL: http://www.cnblogs.com/wade-xu/p/4369094.html
VisualVM使用方法
https://blog.csdn.net/lijie1010/article/details/78805837
◆监控应用程序的性能和内存占用情况
◆监控应用程序的线程
◆分析(Profile)应用程序性能和内存分配情况
◆进行线程转储(Thread Dump)或堆转储(Heap Dump)
◆分析核心转储(Core Dump)
◆保存快照以便脱机分析应用程序。
本地的JVM进程Visual VM会自动检测出来。默认的监控信息并不多,基本功能有点像JConsle,并没有包含更细的内容。此时需要安装插件(Visual VM自带了安装插件的功能),这是Visual VM 的一个优势。
JConsole(以下写作jconsole),VisualVM(以下写作jvisualvm )
都是比较好的JVM调优工具,且都为JDK自带,可在命令行直接启动。
Visual VM比较强大的JVM图形化监控工具,比jconsole强大完善。
用VisualVM进行远程连接的配置和JConsole是一样的。
界面如下:
右侧有Overview、Monitor、Threads、Sampler和Visual GC几个标签,其中Overview中可以看到程序的基本信息和启动参数、环境变量等等;Monitor是几个折线图,用于显示CPU、内存(分为Heap和Metaspace)、Classes和Threads的使用情况或者数量;Visual GC是用图形化的方式显示了Heap的每个空间,如Eden、S0、S1、Old和Metaspace的使用情况,以及它们的空间使用量的变化折线图,和GC的次数、时间等等。在这里我们主要关注Monitor和Visual GC标签。
Ø PID – 程序启动后的进程号,在命令行中可以用 jps命令查看
Ø 主机 – 如果是本机的话显示,localhost,如果是远程主机应该是显示远程主机的主机名或者IP
Ø 主类 – 程序入口类(main方法所在的类)
Ø 参数 – VisualVm 启动的时候使用的一些配置文件路径
Ø JVM – jvm类型
Ø Java – jdk的版本信息
Ø Java Home – JDK安装目录
l JVM参数 – VisualVm 启动时候设置的JVM参数
Ø CPU – 展示java程序运行的时候占用的cpu资源 如下图中橙色的表示程序运行使用的cpu资源百分比,蓝色部分表示垃圾回收占用CPU资源百分比
Ø 堆 – 这里要说明下堆内存的组成部分,堆是由老年代和新生代组成,其中新生代有由"伊甸园"和"两个幸存区组成"三部分组成,堆视图看到的资源占用实际是"老年代"、“伊甸园(Eden)”、"两个幸存者(Survivor )"的一个综合情况。
Ø PermGen – Perm 区用来存放java类以及其他虚拟机自己的静态数据,(常被称为持久代或者方法区)
Ø 类 – 此视图 主要展示 当前程序加载了多少个类
Ø 线程 – 当前程序的线程启动情况
§ 执行垃圾回收 – 手动触发一次GC 相当于在程序代码中调用(System.gc()),如果是远程连接到生产环境中请慎重点击。
§ 堆Dump – 生产当前程序的内存快照hprof文件,对于分析内存溢出问题比较有帮助。(可以查看当前程序内存中的所有对象)
Ø 线程dump – 此按钮主要生产当前程序中所有线程的快照(对分析线程死锁,比较有帮助)
Ø 时间线 – 展示每个线程的实时运行状态(不同颜色代表不同的状态)
Ø 表 – 按照二维表格的形式展示每个线程不同状态的时间统计信息
Ø 详细信息 – 用饼图展示每个线程的运行状态
CPU-> CPU样例 – 主要展示方法消耗的CPU资源比例和时间
CPU->线程CPU时间 – 主要展示线程消耗的CPU资源信息
内存-> 堆柱状图 – 展示堆内存中各种对象占用的字节数和总实例数
内存-> 每个线程分配—展示不同线程占用内存的情况
jdk8 Metaspace 调优
参考URL: https://blog.csdn.net/bolg_hero/article/details/78189621
从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。
Java 8: 从永久代(PermGen)到元空间(Metaspace)
参考URL: https://blog.csdn.net/zhyhang/article/details/17246223?utm_source=blogxgwz0
JVM Metaspace进行了动态扩展,Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关,以满足程序中不断增长的类数据内存占用需求。
堆 = Old+Eden+S0+S1
栈 = PerM区(在java8中改成了metaspace)