JAVA虚拟机 深入理解与实战
内存溢出场景
测试代码
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Person> personList=new ArrayList<Person>();
while(true) {
personList.add(new Person());
System.out.println(personList.size());
}
}
}
经过测试, win10 4G的内存【31151587 次出现内存溢出】
31151587
Exception in thread "main" java.lang. OutOfMemory Error: Java heap space
at java.util.Arrays. copy Of(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at com.cc.Main.main(Main.java:12)
如果觉得时间太少,可以调整运行的大小:-Xms50M -Xmx50M

其中:
-Xms为 JVM 初始分配的堆内存大小
-Xmx为JVM最大允许分配椎内存大小
还有其它的参数:
-XX:PermSize=64M JVM初始分配的非堆内存
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存, 按需分配
增加运行参数,设置快照文件
设置参数:-XX:+HeapDumpOnOutOfMemoryError 把内存溢出时,生成一个快照【注意大小写】
刷新项目,会在项目下生成一个:xxx.hprof的文件
分析hpro的文件
eclipse 下的 memory analyzer工具
下载地址:

java监控工具
jconsole 配置好java的环境变量之后,可以在cmd直接输入jconsole
