在查看内存溢出的时候,我们需要明白,堆溢出和持久代溢出,他们不一样,说到内存泄漏,我们就需要明白,内存中 年老代和新生代,和持久代,这3块的数据
自己的理解:
new了一个对象,会进入到堆里面,先放到年轻代中 也就是new generation ,他放到eden中,如果eden满了,就会进行一次yong gc ,如果还有存活对象(被用到的对象)就会被移到S0区或者S1中转移,如果s0和S1都已经满了,那么这些对象(引用)就会把放到年老代中去,也就是old generation 区,
如果old区,也满了,也会GC一次,也就是FGC,也就是fullGC,如果fullGC一次,就在也不接受新new的对象,往里面存储3如果fullGC,5分钟拒绝服务,jvm拒绝工作,那么5分钟类都没办法使用,所以fullGC时间要短,次数要少,
持久代:当perm里面满了,也会存在fgc,在perm里面存储的是类对象
1.制造内存泄漏的代码
import java.util.ArrayList;
import java.util.List;
public class test2 {
public static void main(String[] args) {
int size=1024 * 1024 *8;
List<byte[] > list =new ArrayList<byte[]>();
for (int i=0;i<1024;i++){
System.out.println("jvm 写入数据"+(i+1)+"M");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(new byte[size]);
}
}
}
2.使用jdk 自带的工具 jvisualvm.exe 查看内存泄漏
我工具的存放路径为:C:\Program Files (x86)\Java\jdk1.8.0_131\bin
执行我的程序,查看visual GC
你会发现eden中数据,然后慢慢的移动到old,
当你内存泄漏了,old 也就满了,在监视中也可以看到