JVM:可视化 JVM 故障处理工具( 三 )

list = new ArrayList<>();for (int i = 0; i < nums; i++) {Thread.sleep(50);list.add(new OOMObject());}System.gc();}public static void main(String[] args) throws InterruptedException {fillHeap(1000);}}这个案例是使用大约 64KB/50ms 的速度向 Java 堆中填充数据 , 一共填充 1000 次 。
程序执行后可以看到 , 在整个 Java 堆中 , 曲线一直是平滑向上的 。
JVM:可视化 JVM 故障处理工具文章插图
切换到内存标签页 , 查看 Eden 后可以发现 , 整个 Eden 的图形是一个折线:
JVM:可视化 JVM 故障处理工具文章插图
再切换到 Gen, 可以看到整个老年代也是折叠向上的:
JVM:可视化 JVM 故障处理工具文章插图
我们已经在代码里加了 System.gc(), 为什么看起来没生效呢?
因为 System.gc() 是在 fillHeap() 方法中的 , 在 GC 的时候 , 还在作用域中 , 想要正常回收老年代 , 需要将 System.gc() 这段代码转移到 fillHeap() 外面 。
先修改下代码:
public static void main(String[] args) throws InterruptedException {fillHeap(1000);System.gc();// GC 后停顿 3s, 方便观察图像Thread.sleep(3000);}
JVM:可视化 JVM 故障处理工具文章插图
可以看到在最后进程结束的时候 ,Gen 的柱状图已经没有内存占用了 , 内存回收成功 。
3. VisualVMVisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一 , 曾经在很长一段时间内是 Oracle 官方主力发展的虚拟机故障处理工具 。
VisualVM 同样在 JDK/bin 这个目录下 , 双击 jvisualvm.exe 即可运行 。 在启动之后 , 直接在左侧会显示当前在本机运行的所有虚拟机进程 。
JVM:可视化 JVM 故障处理工具文章插图
VisualVM 基于 NetBeans 平台开发工具 , 所以一开始它就具备了通过插件扩展功能的能力 , 有了插件扩展支持 ,VisualVM 可以做到:

  • 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo) 。
  • 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack) 。
  • dump 以及分析堆转储快照(jmap、jhat) 。
  • 方法级的程序运行性能分析 , 找出被调用最多、运行时间最长的方法 。
  • 离线程序快照:收集程序的运行时配置、线程 dump 、内存 dump 等信息建立一个快照 , 可以将快照发送开发者处进行 Bug 反馈 。
  • 其他插件带来的无限可能性 。
VisualVM 的插件可以在 工具->插件 中联网后直接安装 。
JVM:可视化 JVM 故障处理工具文章插图
JVM:可视化 JVM 故障处理工具文章插图
我这里只安装了两个最常用的 , 一个是 GC 监控的插件 , 还有一个可以动态插入调试程序的插件 。
我这里使用最常用的开发工具 IDEA 启动过程演示一下通过 VisualVM 监控程序 GC。
JVM:可视化 JVM 故障处理工具文章插图
首先我们启动 IDEA, 直到 IDEA 可以正常操作 , 看下 VisualVM 的 GC 监控 。
JVM:可视化 JVM 故障处理工具文章插图