029垃圾分代回收机制

栈----主要用于计算的,计算都在方法中的而方法调用在栈。栈的东西使用完成就赶紧清除的,所以栈不会产生垃圾,会立即清除

方法区----存储类的信息 也没有垃圾,偶尔也会回收但是频率会很低

堆------存储的是对象,无用的对象(垃圾)

我们程序员干预和参与不了垃圾处理机制的整个过 程,我们只是能通知

java针对所有的数据类型的内存从一开始就确定了,整个内存的开辟、维护、回收全部由java自己做的不用我们去关心,主要把中心放在代码逻辑上(上诉的所有过程java程序员都干预不了) 

宏观角度

在程序启动的时候,开始监测堆内存的使用情况,如果堆内存的使用率超过70%就会通知GC进行垃圾回收。每次回收的量是不一样的,还在使用的堆变量是不回收的。GC是Garbage Collector,垃圾收集器。 

System.gc()通知GC进行垃圾回收

微观角度

堆内存从垃圾回收角度可以分成新生代(伊甸园区、幸存区(fromspace、tospace)以及老生代,新创建的对象先放在新生代的伊甸园区,开始进行一次扫描,如果检测到对象无用,通知系统进行垃圾回收,如果还是使用就把对象移到幸存区,进行多次扫描,如果检测对象无用通知系统进行垃圾回收,如果还是使用就把对象移动到老生代。进行多次扫描如果检测对象无用通知系统进行垃圾回收,如果还在使用就继续呆在老生代。老生代的扫描

比幸存区扫描的频率低。如果老生代的对象突然销毁就可能会导致系统崩溃。

新生代回收(minor collect) 初代回收 只回收新生代

老生代回收( full   collect)完全回收 回收新生代和老生代

如果一个新创建的对象内存较大?

 如果新对象的内存较大在新生代存储不了,会进行一次初代回收,再往新生代存储,如果新对象还是存储不了,会进行第二次初代回收,再往新生代存储,如果还是存储不了,就把新对象移到老生代进行存储,如果在老生代还是存储不了,会进行一次完全回收(新生代和老生代都回收了),新对象要往新生代存储,如果新生代还是存储不了,会进行第三次初代回收,新对象要往新生代存储,如果新对象还是存储不了,就把新对象移动到老生代存储,如果新对象还是存储不了,老生代会进行第二次完全回收,新对象要往新生代进行存储,对象依然存储不了,就把对象移动到老生代,对象依然还是存储不了系统就报错-----OutOfMemoryError内存溢出错误

原文地址:https://www.cnblogs.com/xuwangqi/p/11122956.html