垃圾回收日志与算法深度解读
新生代与老年代垃圾收集器实现详解
VM options:
-verbose:gc
//会输出详细的垃圾回收的日志
-Xms20M
//堆容量的初始大小
-Xmx20M
//堆容量的最大大小 -- 两个值一般设置为一样的,这样不会出现抖动的现象。
-Xmn10M
//新生代的大小是10M
-XX:+PrintGCDetails
//打印出垃圾回收详细的信息
-XX:SurvivorRatio=8
//eden和 survivor的比例为8:1的比例。
//添加上方的VM options 在运行
public class MyTest1 {
public static void main(String[] args) {
int size = 1024 * 1024; // 1M 的容量
byte[] myAlloc1 = new byte[2 * size]; // 创建之后每一个元素都是0
byte[] myAlloc2 = new byte[2 * size]; // 创建之后每一个元素都是0
byte[] myAlloc3 = new byte[2 * size]; // 创建之后每一个元素都是0
// byte[] myAlloc4 = new byte[2 * size]; // 创建之后每一个元素都是0 添加上这行代码便可垃圾回收
System.out.println("hello world");
}
}
//随着上边数组的参数的变化,结果不一样。
> Task :MyTest1.main()
GC (Allocation Failure) [PSYoungGen: 6815K->544K(9216K)] 6815K->6696K(19456K), 0.0042369 secs] [Times: user=0.04 sys=0.01, real=0.00 secs]
// GC(分配失败)。 PSYoungGen = Parallel Scavenge收集器; 新生代的空间是9M 、
// 6815 - 544 = 6371执行完gc之后,新生代释放的空间容量
// 6815 - 6696 = 119执行完gc之后,总的堆空间释放的空间容量
[Full GC (Ergonomics) [PSYoungGen: 544K->0K(9216K)] [ParOldGen: 6152K->6426K(10240K)] 6696K->6426K(19456K), [Metaspace: 2798K->2798K(1056768K)], 0.0043323 secs] [Times: user=0.03 sys=0.00, real=0.00 secs]
// Full GC(Ergonomics 工程学) , 会让业务线程暂停。 新生代被清空了。老年代不减反增。
// 对元空间也进行了垃圾回收,但是一个字节都没有被回收。
hello world
Heap
( 0x00000007bf600000 内存占据的空间地址。)
PSYoungGen
total 9216K, used 2290K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)
eden space 8192K, 27% used [0x00000007bf600000,0x00000007bf83c8d8,0x00000007bfe00000)
from space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)
to space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
ParOldGen
total 10240K, used 6426K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
//老年代的空间是10M
object space 10240K, 62% used [0x00000007bec00000,0x00000007bf246998,0x00000007bf600000)
Metaspace
used 2805K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 291K, capacity 386K, committed 512K, reserved 1048576K
数组大小设置的不同,出现的情况不同:
2 2 2 2 的时候出现Full GC
2 2 3 3 的时候就没有出现Full GC了。
'出现上述情况的原因:当新生代的空间不够完成分配时,直接会在老年代的空间完成分配。
jdk1.8默认的使用的垃圾回收期为:
PSYoungGen: Parallel Scavenge (新生代垃圾收集器)
ParOldGen:Parallel Old (老年代垃圾收集器)
JVM的默认参数 查看: java -XX:+PrintCommandLineFlags -version
UseParallelGC : 默认的是使用ParallelGC