垃圾回收机制浅析
知识点1 垃圾分代回收机制
1、栈:用于计算
-
这块肯定不会产生垃圾,涉及不到回收问题
2、方法区:存储类
-
这块也没有垃圾
3、堆:无用对象(需要垃圾回收)
-
需要回收垃圾:无用对象
扩展知识点:
C/C++:提前开辟内存(需要程序员操作完成)
Java:自动开辟内存(由Java自己完成,自动分配,无需关心创建与回收),但是Java程序员无法干预开辟、维护、回收(程序员只能通知,无法参与)
java针对所有的数据类型的内存从一开始就确定了,我们只需要把重心放在代码逻辑上
宏观过程:在程序启动的时候,开始监测堆内存的使用情况,如果堆内存的使用率超过70%就会通知GC垃圾收集器(Garbage Collecter)进行垃圾回收
-
堆内存从垃圾回收的角度可以分为新生代(伊甸园区、幸村区(fromspace、tospace))以及老生代,新创建的对象先放在新生代的伊甸园区,开始进行一次扫描,如果检测到对象无用通知系统进行回收,如果还是使用就把对象移动到老生代。进行多次扫描,如果检测到对象无用通知系统,进行垃圾回收。如果还在使用就继续呆在老生代
-
老生代的扫描频率幸存区的扫描频率低
-
如果老生代的对象突然销毁就可能会导致系统崩溃
新生代回收(minor collect):初代回收
老生代回收(full collect):完全回收
相关问题
1、如果一个新创建的对象内存较大?
答:如果新对象的内存较大,在新生代存储不了,会进行一次初代回收,再往新生代存储,如果新生代还是存储不了,会进行第二次回收,再往新生代存储,如果还是存储不了,就把新对象移动到老生代进行存储,如果在老生代还是存储不了,会进行一次完全回收,新对象要往新生代存储,如果新生代还是存储不了,会进行第三次初代回收,新对象要往新生代存储,如果新生代还是存储不了,把新对象移动到老生代存储,新生代还是存储不了,会进行第二次完全回收,新对象要往新生代进行存储,对象依然存储不了,就把对象移动到老生代,对象依然还是存储不了系统就报错---OutOfMemoryError内存溢出错误
第1次 新生代存储失败
第1次 初代回收
第2次 新生代存储失败
第2次 初代回收
第3次 新生代存储失败
第1次 老生代存储失败
第1次 完全回收
第4次 新生代存储失败
第3次 初代回收
第5次 新生代存储失败
第2次 老生代存储失败
第2次 完全回收
第6次 新生代存储失败
第3次 老生代存储失败
报错:
OutOfMemoryError内存溢出错误