【大数据day04】——JVM优化 上(jvm的内存模型( 五 )


4.3、将内存使用情况dump到文件中
有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也是支持dump到文件中的 。
#用法:jmap -dump:format=b,file=dumpFileName #示例jmap -dump:format=b,file=/tmp/dump.dat 6219
可以看到已经在/tmp下生成了dump.dat的文件 。
4.4、通过jhat对dump文件进行分析
在上一小节中,我们将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看 。
#用法:jhat -port#示例:[root@node01 tmp]# jhat -port 9999 /tmp/dump.dat Reading from /tmp/dump.dat...Dump file created Mon Sep 10 01:04:21 CST 2018Snapshot read, resolving...Resolving 204094 objects...Chasing references, expect 40 dots........................................Eliminating duplicate references........................................Snapshot resolved.Started HTTP server on port 9999Server is ready.
打开浏览器进行访问::9999/
在最后面有OQL查询功能 。
4.5、通过MAT工具对dump文件进行分析 4.5.1、MAT工具介绍
MAT(Tool),一个基于的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象 。
官网地址:
4.5.2、下载安装
下载地址:
资料中已提供
将下载得到的-1.8.0.-win32.win32..zip进行解压:
4.5.3、使用
查看对象以及它的依赖:
查看可能存在内存泄露的分析:
5、实战:内存溢出的定位与分析
内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等等,都可能会造成内存溢出 。
如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug 。
首先,我们得先学会如何定位问题,然后再进行分析 。如何定位问题呢,我们需要借助于jmap与MAT工具进行定位分析 。
接下来,我们模拟内存溢出的场景 。
5.1、模拟内存溢出
编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成 。如果程序能够正常执行,最后打印ok 。
package cn.wbslz.jvm;import java.util.ArrayList;import java.util.List;import java.util.UUID;public class TestJvmOutOfMemory {public static void main(String[] args) {List list = new ArrayList<>();for (int i = 0; i < 10000000; i++) {String str = "";for (int j = 0; j < 1000; j++) {str += UUID.randomUUID().toString();}list.add(str);}System.out.println("ok");}}
为了演示效果,我们将设置执行的参数,这里使用的是Idea编辑器 。
#参数如下:-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
5.2、运行测试
测试结果如下:
java.lang.OutOfMemoryError: Java heap spaceDumping heap to java_pid5348.hprof ...Heap dump file created [8137186 bytes in 0.032 secs]Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3332)at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)at java.lang.StringBuilder.append(StringBuilder.java:136)at cn.itcast.jvm.TestJvmOutOfMemory.main(TestJvmOutOfMemory.java:14)Process finished with exit code 1