• 简单理解垃圾回收


    • 什么是垃圾回收?
    • 垃圾回收的是什么?
    • 如何判断为垃圾?
    • 垃圾是怎样被回收的?
    • 垃圾回收哪些区域的内存?

    什么是垃圾回收

    垃圾回收就是将被虚拟机视为垃圾的对象所占的内存释放掉。

    垃圾回收的是什么

    回收的是对象所占的内存

    如何判断为垃圾

    在垃圾收集器对堆内存进行回收前,会先判断哪些对象还在“存活”,哪些对象已经“死去”,这些“死去”的对象,就是我们需要进行回收的垃圾。一般判定为垃圾有两种算法。

    1. 引用计数算法(已淘汰)

      引用计数算法,是指给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1,当引用失效时,计数器的值就减1。当计数器值为0时,该对象就会被回收。

      • 优点:简单直接,效率高。
      • 缺点:对于对象之间的相互引用无法解决,导致内存的泄露。
    2. 可达性分析算法

      通过一系列被称为“GC Roots”的对象作为起点,然后向下搜索,所走过的路径被称为引用链。当一个对象到 GC Roots之间没有任何引用链时,则说明该对象是不可用的,虚拟机就会将它们的内存释放掉。

    GC Roots有哪些

    • 虚拟机栈中引用的对象。
    • 方法区中类静态属性引用的对象。
    • 方法区中常量引用的对象。
    • 本地方法栈中引用的对象。

    垃圾是怎样被回收的

    通过垃圾回收算法,JVM对垃圾进行标定然后回收其占用的内存空间。常见的垃圾回收算法有三种:

    1. 复制算法
      • 优点:简单高效,不会出现内存碎片问题
      • 缺点:内存利用率低,只有一半。如果存活对象很多的时候,效率低,因为需要复制很多对象。
    2. 标记清除
      • 优点:利用率百分之百
      • 缺点:标记和清除的效率不高,会产生内存碎片
    3. 标记整理
      • 优点:利用率百分之百,没有内存碎片
      • 缺点:效率很低,因为需要挪动内存

    不同内存区域采用的回收算法不同,新生代使用复制算法。因为绝大多数对象不需要回收。老年代一般采用标记整理算法,CMS垃圾回收器采用标记清除算法。

    垃圾回收哪些区域的内存

    我们常谈的回收,绝大多数是回收堆内存。

  • 相关阅读:
    【转】高并发情况下的单例模式
    json替换jsonp实现跨域请求
    asp.net学习——Response对象
    DoS攻击
    Java学习笔记-12.传递和返回对象
    Java学习笔记-11.运行期间类型鉴定
    Java学习笔记-10.io流
    java学习笔记-9.违例差错控制
    Java学习笔记-序
    java学习笔记-8.对象的容纳
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/13702796.html
Copyright © 2020-2023  润新知