方框区:所占空间大小 空白区:未使用空间 颜色区:已使用空间
最大15次新生代GC的原因是:对象的对象头(object header)中markword区域的GC标记信息(分代年龄)占4bit,也就是15
linux终端执行下面的命令行
jvsualvm
package zhai.jvm;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* -Xms10m -Xmx10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails
*/
public class TestJVM {
byte[] data = new byte[1024*100];
public static void main(String[] args) throws InterruptedException {
List<TestJVM> list = new ArrayList<>();
while (true) {
list.add(new TestJVM());
TimeUnit.SECONDS.sleep(1);
}
}
}
一个死循环,每隔1s,往集合内放入一个1K大小的数据。
-Xms 设置初始化内存 -Xmx 设置最大分配内存 -XX:+UseConcMarkSweepGC 使用CMS GC -XX:+PrintGCDateStamps 打印GC 时间戳 -XX:+PrintGCDetails 打印GC详情
随着时间的推移,对象不断的从新生代被转移到老年代,并且不能被Full CG,最后先导致老年代满了,然后很快新生代也满了,导致系统报错 OutOfMemoryError: Java heap space
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at zhai.jvm.TestJVM.<init>(TestJVM.java:11)
at zhai.jvm.TestJVM.main(TestJVM.java:16)