zoukankan      html  css  js  c++  java
  • JVM 垃圾回收算法及基本概念

    一、理论算法

    引用计数法

    比较古老经典的垃圾手机算法,核心是在对象被其他所引用时计数器 +1,而当引用失效时则 -1

    这种方式有个严重的问题:无法处理循环引用的情况,还有每次进行加减操作比较浪费系统性能。

    标记清除法

    分为标记和清除两个阶段进行处理内存中的对象

    弊端是空间碎片问题,垃圾回收后的空间是不连续的,不连续的内存空间的工作效率要低于连续的空间

    二、工程实践

    标记压缩法:常用

    在标记清除法基础上做了优化,把存活的对象压缩到内存一端,然后进行垃圾清理

    Java 老年代使用的就是这个算法

    因为对象太多,复制消耗性能

    复制算法:常用

    核心思想就是将内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存的存留对象复制到未被使用的内存块中去,之后去清除之前正在使用的内存块中的所有对象,反复去交换两个内存的角色,完成垃圾手机。

    Java 新生代的 from 和 to 空间就是使用这个算法

    对象少,可以复制

    分代算法

    根据对象的特点把内存分为 N 块,然后根据每个内存的特点使用不同的算法

    对于新生代和老年代来说,新生代回收频率很高,但是每次回收耗时都很短,而老年代回收频率较低,但是耗时会相对较长,所以应该尽量减少老年代的 GC

    分区算法

    将整个内存分为 N 多个小的独立空间,每个小空间都可以独立使用,这样细粒度的控制一次回收一些小空间,而不是对整个空间进行 GC,从而提升性能,并较少 GC 停顿世界。

    三、停顿现象

    为了让垃圾回收器可以高效执行,大部分情况下,会要求系统进入一个停顿状态。停顿的目的是终止所有应用线程,只有这样系统才不会有新的垃圾产生,同时,停顿保证了系统状态在某一瞬间的一致性,也有益于更好地标记垃圾对象。

    四、回收细节

    1. 对象如何进入老年代

    一般而言对象首次创建会被放置在新生代的 eden 区,如果没有 GC 介入,则对象不会离开 eden 区,那么 eden 区的对象如何进入老年代呢?

    一般来讲,只要对象的年龄达到一定的大小,就会自动离开年轻代进入老年代,对象年龄是由对象经历的 GC 次数决定的,在新生代每次 GC 之后,如果对象没有被回收则年龄 +1,虚拟机提供了一个参数来控制新生代对象的最大年龄,当超过这个年龄范围就会晋升老年代。

    默认情况下为 15 
    -XX:MaxTenuringThreshold
    

    2. Java 堆

    堆是和应用程序关系最密切的内存空间,几乎所有的对象都存放在其中,并且 Java 堆是完全自动化管理的,通过垃圾回收机制,垃圾回收会自动清理,不需要显式释放。

    根据垃圾回收机制的不同,Java 堆有可能拥有不同结构。最为常见的是将整个 Java 堆分为新生代和老年代。其中新生代存放新生的对象或者年龄不大的对象,老年代则存放老年代对象。

    新生代分为 eden 区、s0 区、s1 区,s0 和 s1 也被称为 from 和 to 区,它们是两块大小相同并且可以互换角色的空间。

    绝大多数情况下,对象首先分配在 eden 区,在一次新生代回收之后,如果对象还存货,则会进入 s0 或者 s1 区,之后每经过一次新生代回收,如果对象存活则它的年龄就 +1,当对象到达一定的年龄后,则进入老年代。

    3. Java 栈

    Java 栈是一块线程私有的内存空间,一个栈,一般由三部分组成:

    • 局部变量
    • 操作数栈
    • 帧数据区
    局部变量表

    用于报错函数的参数及局部变量

    操作数栈

    主要保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间

    帧数据区

    除了局部变量表和操作数栈外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着访问常量池的指针,方便程序访问常量池

    另外,当函数返回或者出现异常时,虚拟机必须有一个异常处理表,方便发送异常的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。

    4. Java 方法区

    Java 方法区和堆一样,方法区是一块所有线程共享的内存区域,它保存系统的类信息,比如类的字段、方法、常量池等。方法区的大小决定了系统可以保存多少个类,如果系统定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出错误

    方法区可以理解为永久区:Perm

    没有修不好的电脑
  • 相关阅读:
    Time Zone 【模拟时区转换】(HDU暑假2018多校第一场)
    HDU 1281 棋盘游戏 【二分图最大匹配】
    Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】
    Codeforces Round #527 (Div. 3) D2. Great Vova Wall (Version 2) 【思维】
    Codeforces Round #527 (Div. 3) D1. Great Vova Wall (Version 1) 【思维】
    Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】
    Avito Cool Challenge 2018 E. Missing Numbers 【枚举】
    Avito Cool Challenge 2018 C. Colorful Bricks 【排列组合】
    005 如何分析问题框架
    004 如何定义和澄清问题
  • 原文地址:https://www.cnblogs.com/duniqb/p/12702443.html
Copyright © 2011-2022 走看看