zoukankan      html  css  js  c++  java
  • 029垃圾分代回收机制

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

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

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

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

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

    宏观角度

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

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

    微观角度

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

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

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

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

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

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

  • 相关阅读:
    类的高内聚低耦合
    面向对象是三个特征:封装、继承、多态
    抽象类和接口
    remoting和webservice
    装箱和拆箱
    数据库
    遍历TextBox控件
    索引类型
    .NET和C#有什么区别
    三层架构
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11122956.html
Copyright © 2011-2022 走看看