被标记为正确答案的答案不再正确。
正如Sumit所说,只有在使用live选项(在histo和dump操作中)时,它才会导致Full GC。
Java 7和Java 8都有这个选项
-histo[:live]
打印堆的直方图。对于每个Java类,都会打印对象数量、内存大小(以字节为单位)和完全限定类名。JVM内部类名以星号(*)前缀打印。如果指定了live子选项,则仅计算活动对象。
-dump:[live,] format=b, file=filename
将Java堆以hprof二进制格式转储到文件名中。
live子选项是可选的,但指定时仅转储堆中活动对象。要浏览堆转储,可以使用jhat(1)命令读取生成的文件。
您还可以使用操作GC.heap_dump和选项-all的jcmd命令。
GC.heap_dump
生成Java堆的HPROF格式转储。
影响:高:取决于Java堆的大小和内容。请求完全GC,除非指定了-all选项。
权限:java.lang.management.ManagementPermission(monitor)
语法:GC.heap_dump [options]
参数:
- filename: 转储文件的名称(STRING,没有默认值)
选项:(必须使用或=语法指定选项)
- all: [可选] 转储所有对象,包括不可访问对象(BOOLEAN,false)
示例:jcmd 3181 GC.heap_dump -all dump
您可以添加-XX:+PrintGCDetails标志来查看是否正在进行完全GC。例如,当我使用没有-all的jcmd时,我会看到类似以下内容的消息。
200,658: [全垃圾回收(初始化堆转储) 200,658: [CMS: 5040K->4158K(18432K), 0.0171885秒] 11239K->4158K(25856K), [元空间: 18053K->18053K(1064960K)], 0.0173941秒] [时间: 用户=0.01系统=0.00, 实际=0.02秒]