在idea中编写代码
public class JVMTest {@Testpublic void test() throws InterruptedException {while (true) {Thread.sleep(1000);System.out.println(123);}}
}
配置虚拟机的设置

配置如下:保证堆大小始终是10M
-Xms10m -Xmx10m

之后运行程序即可。
jps 查看java进程概述

输入jconsole 打开java监控和管理控制台

选择

选择不安全链接

点击-内存,可以查看年轻代垃圾收集的次数

看右下角,鼠标悬浮第一列

看右下角,鼠标悬浮第二列

看右下角,鼠标悬浮第三列

可以发现峰值处发生GC

点击线程标签

点击VM概要

jstat 观察gc情况
常用
jstat -gcutil 进程号

查看年轻代gc信息
jstat -gcnew 进程号

查看老年代gc信息
jstat -gcold 进程号

jstack 查看进程内的线程信息
jstack 进程号

jmap 查看堆内存使用状况
常用指令
这里的file是当前路径
jmap -dump:file=文件名 进行号

文件生成

jmap -heap 进行号

jdk中自带该工具,去jdk的安装目录中bin下找jvisualvm.exe用管理员打开即可

双击进入监控界面

概述中,可以看到堆内存配置的大小

监控中可以点击触发垃圾回收

点击堆dump类似jmap -dump 操作

点击dump之后,可以查看基本信息

点击类之后可以查看类的实例占用的内存大小

刚才下载的dump文件,可以用这个工具查看

在概要中可以查看信息

类中可以查看占用的内存

因为linux系统中没有相关的图形化界面,我们的做法是利用jmap -dump:file=文件名称 进程号 dump文件到指定路径,然后下载dump文件后,在本机windows系统中通过jvisualvm工具来查看。
更改虚拟机配置
-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError

更改java代码
public class JVMTest {@Testpublic void test() throws InterruptedException {ArrayList list = new ArrayList<>();int i = 0;while (true) {list.add(i);}}
}
点击运行,发现直接OOM了

我们去项目相关文件夹中,找到dump的文件

jvisualvm工具装载dump文件,通过概要查看

类中可以查看具体的错误信息
