1、JVM参数类型
JVM包括3种参数类型,标准类型,X参数类型和XX参数类型。
标准参数: -help -version
X参数类型: -Xint(解释执行) -Xcomp(第一次使用就编译成本地代码)
XX参数类型: -XX:+UseG1GC -Xmx(最大堆内存) -Xms(最小堆内存)
2、查看JVM运行时参数
介绍以下几个Java命令:jps、jinfo、jstat
jps命令:查看Java进程
jinfo命令:
1、jinfo -flag MaxHeapSize [pid] //查看对应pid的最大内存
2、jinfo -flags [pid]//查看所有运行时参数
jstat命令(类装载,垃圾收集,JIT编译):
1、jstat -class [pid] [时间间隔(ms)] [次数]//查看类装载信息
2、jstat -gc [pid] [时间间隔(ms)] [次数]//查看垃圾回收信息
3、实战内存溢出
1、编写测试代码
public class TestOOM {
static class OOMObject{
}
public static void main(String[] args) {
List<OOMObject> oomObjectList = new ArrayList<>();
while (true){
oomObjectList.add(new OOMObject());
}
}
}
2、在IDEA中配置JVM参数,设置最大最小内存,设置当发生OOM时生成HeapDump,设置HeapDump生成文件的路径,参数如下
-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

当在运行时就想导出HeapDump时,可以使用jmap命令,如下:
jmap -dump:format=b,file=heap.hprof 24120
format=b 表示导出二进制文件
file=heap.hprof 表示导出二进制文件的文件名
24120 是进程的id
3、运行代码发生OOM后,或者导出HeapDump后,即可在项目文件加下生成一个*.hprof的文件
4、使用MAT分析导出的文件,先在https://www.eclipse.org/mat/downloads.php下载MAT软件,打开*.hprof文件

可以看出,MAT已经帮我们推断出,可能是内存泄漏引起的OOM。
点击Histogram

我们可以通过MAT的Histogram功能分析内存中对象的个数。从图中可以看出,Student对象个数达到了777535个。
通过这个,我们可以轻易的推断出程序里有问题的地方。
网友评论