垃圾回收机制浅析

 

知识点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内存溢出错误

 

posted @ 2020-08-18 21:03  minnersun  阅读(134)  评论(0编辑  收藏  举报