zoukankan      html  css  js  c++  java
  • 基于分代的堆结构

    堆的结构是基于分代理论(垃圾回收)的,这种结构划分,是为了更好地进行垃圾回收。

    我们将堆分为老年代、新生代。

    永久代、元空间、堆这几个概念一直比较混乱。但是看到上图,堆的定义只包含 新生代 和 老年代。

    这一点我们在实际设置 JVM 的参数的时候,你会发现,设置的空间的确只包含 新生代 和 老年代。

    新生代 和 老年代 是根据对象的生命周期特点来区别的。

    堆参数的设置

    接下来,我们来看下 Java 8 中,关于 堆 参数的设置:

    -Xms:表示堆的起始内存

    -Xmx:表示堆的最大内存

    一旦堆需要的空间大于 -Xmx 的值,就会抛出 Out Of Memory Error 异常。

    一般情况下,将起始内存的值与最大值设置为相同值,避免重新分配空间,浪费时间。

    可以看到,我在这里设置堆的起始大小和最大大小为 10M,最后的输出结果,可以看到 新生代 和 老年代,两者的和为 10M 左右。

    最后的那个 元空间,并不在 堆的设置中。

    我们注意到:新生代下面有三个分区,老年代下面只有一个分区。我们后面来介绍。

    新生代结构

    在新生代结构中,我们注意到分为了三个区域。这是为什么呢?

    我们之前说过,新生代用来存放绝大多数新建的对象,这些对象绝大多数朝生夕灭。所以,一般采用 标记-复制 算法来进行处理。

    之前介绍的 标记 - 复制 算法,是将内存区域分为 1:1,而这里,默认的分配为 8:1:1。

    当然,这些比例是可以设置的。除此之外,还有个比较有趣的地方。

    我们看上面的 eden 占用 2048 K,from 和 to 都占用 512 K,而显示的 新生代 总共占用了 2560 K。2560 = 2048 + 512,注意这里只加了一个 512 K。

    等接下来,讲到对象的创建分配过程,就明白此处的原因了。

    老年代结构

    老年代的结构,只有一个结构,简简单单的。

  • 相关阅读:
    05Linux文件修改
    07Linux基本权限
    09Linux软件安装
    搬家
    web项目和单元测试
    session_start() 对 HTTP_REQUEST扩展/fsockopen函数 的影响
    从不同架构的角度进行web项目的需求分析和系统设计
    程序中的风险控制
    【原创】 书籍推荐
    【转载】10个效果最佳的编程字体
  • 原文地址:https://www.cnblogs.com/zhouzhiyao/p/13176242.html
Copyright © 2011-2022 走看看