eclipse中设置debug标签页的vm参数
1,Run->Debug configurations->Java Application
2,选中已经写好的项目
3,Arguments->VM arguments
4,在VM arguments 里面就可以对虚拟机的内存参数进行设置
5,设置完成后,Apply->Debug
6,过程结束
7.获取dump文件
8.用MAT工具进行分析.
设置参数如下
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\\dump.hprof
内存映像分析工具(例如eclipse memory analyzer)堆dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的.
也就是要先分清楚到底是出现了内存泄漏(memory leak)还是内存溢出(memory overflow)
import java.util.ArrayList;
import java.util.List;
public class HeapOOM {
static class OOMObjec{
}
public static void main(String[] args) {
List<OOMObjec> list = new ArrayList<>();
while (true) {
list.add(new OOMObjec());
}
}
}
注意项目名称不要有下划线,不然会报错说找不到主类.
[GC (Allocation Failure) 7727K->5313K(19456K), 0.0102958 secs]
[GC (Allocation Failure) -- 13505K->19416K(19456K), 0.0150072 secs]
[Full GC (Ergonomics) 19416K->10071K(19456K), 0.1473511 secs]
[Full GC (Ergonomics) 17568K->15873K(19456K), 0.1319149 secs]
[Full GC (Allocation Failure) 15873K->15869K(19456K), 0.0746161 secs]
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid27392.hprof ...
Heap dump file created [27960490 bytes in 0.080 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at HeapOOM.main(HeapOOM.java:14)
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\\dump
[GC (Allocation Failure) 7626K->5249K(19456K), 0.0075257 secs]
[GC (Allocation Failure) 13441K->11134K(19456K), 0.0121616 secs]
[Full GC (Ergonomics) 11134K->11066K(19456K), 0.1505298 secs]
[Full GC (Ergonomics) 18562K->16355K(19456K), 0.1338673 secs]
[Full GC (Allocation Failure) 16355K->16343K(19456K), 0.0911646 secs]
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:\\dump ...
Heap dump file created [27960542 bytes in 0.452 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at HeapOOM.main(HeapOOM.java:14)
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [util.c:840]
1,堆是存储对象实例的,即自己写的类都是在堆中进行内存分配的;设置堆的大小:-Xmx20M(最大值) ,-Xms20M(最小值)。
2,栈是存储局部变量,操作栈,动态链接,方法出口(都在栈桢中) 的地方,调用方法时,会创建栈桢;设置栈的大小:-Xss128K。
3,方法区是存放Class的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等。此外运行时常量池是属于方法区的,即存放常量,静态常量等;设置方法区大小,-XX:PermSize=10M和-XX:MaxPermSize=10M。
4,本地直接内存;设置本地直接内存大小:-XX:MaxDirectMemorySize(默认与-Xmx的值一样)。