• 029垃圾分代回收机制


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

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

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

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

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

    宏观角度

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

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

    微观角度

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

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

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

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

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

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

  • 相关阅读:
    JS实战 · 表单验证
    JS实战 · 仿css样式选择器
    JS实战 ·  收缩菜单表单布局
    cookie自动登录的实现
    redis 3.2.5单机版安装、使用、systemctl管理Redis启动、停止、开机启动
    yum问题解决
    配置yum镜像源
    shell笔记
    CCIE总结:路由器、交换机
    云主机如何挂在磁盘
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11122956.html
Copyright © 2020-2023  润新知