JVM - GC
GC算法 GC-Root
eg:在heap中有A,B两个对象互相引用,但是现在没有栈桢中的引用去指向A和B,根据对象引用算法不能回收,但是根据GC Root算法A,B都没有指向栈桢中的局部变量表,所以A,B都会被回收
标记清-楚算法
gc-root算法可以通过A对象引用了C对象一直找可以找到至K对象,能到达的都标记一下,然后清理掉没标记过的,先标记再清楚.两次Dom
复制-搜集算法
标记-整理算法
分代-收集算法
JDK1.8前的永久代; JDK1.8后被替代为元空间
内存模型
GC内存回收以及四种引用的分类
分代模型上的GC
垃圾回收器 --------- 交互性和吞吐率总是矛盾的
新生代收集器
STW 单线程垃圾收集器(默认新生代使用这种收集器)
ParNew是Serial版本的多线程垃圾收集器(默认新生代使用这种收集器)
Parallel Scavenge收集器
老年代收集器
Serial Old收集器
Parallel Old收集器
CMS收集器
Java内存泄漏的经典原因
1.对象定义在错误的方位
2.异常处理不当
3.集合数据管理不当
垃圾回收日志与算法深度解读
Minor GC
-verbose:gc 垃圾回收的详细信息
-Xms20M Heap的初始空间大小(新生代+老年代)
-Xmx20M Heap的最大空间大小(新生代+老年代)
-Xmn10M Heap中新生代的大小
-XX:+PrintGCDetails 打印gc详细信息
-XX:SurvivorRatio=8 Eden和Survior空间的大小比例
public static void main(String[] args) {
int size = 1024 * 1024;
byte[] myAlloc1 = new byte[2 * size];
byte[] myAlloc2 = new byte[2 * size];
byte[] myAlloc3 = new byte[3 * size];
System.out.println("hello world");
}
gc后新生代释放: 5646-624 = 5022k
gc后总的Heap空间释放: 5646-4728 = 918k
5022-918 = 4104k -〉gc后老年代减少的空间(即总堆-新生代=老年代)
结论: Minor gc后,新生代一部分被真的释放掉了,还有一部分晋升到了老年代
-------------------------------------
FULL GC
-verbose:gc 垃圾回收的详细信息
-Xms20M Heap的初始空间大小(新生代+老年代)
-Xmx20M Heap的最大空间大小(新生代+老年代)
-Xmn10M Heap中新生代的大小
-XX:+PrintGCDetails 打印gc详细信息
-XX:SurvivorRatio=8 Eden和Survior空间的大小比例
public static void main(String[] args) {
int size = 1024 * 1024;
byte[] myAlloc1 = new byte[2 * size];
byte[] myAlloc2 = new byte[2 * size];
byte[] myAlloc3 = new byte[2 * size];
byte[] myAlloc4 = new byte[2 * size];
System.out.println("hello world");
}
PSYoungGen:Parallel Scavenge(新生代垃圾收集器)
ParOldGen:Parallel Old(老年代垃圾收集器)
阈值和垃圾收集器类型对于对象分配的影响实战分析
-XX:PretrnureSizeThreshold=111111
当一个对象在新生代无法分配时 将直接放入老年代 如果老年代也无法接受 那么会报对空间不足
system.gc()会执行Full GC