在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存。关注我的公众号「Java面典」了解更多 Java 相关知识点。

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、Survivor From 区和 Survivor To 区,默认情况下年轻代按照 8 : 1 : 1 的比例来分配)和老年代。

新生代

  • 新生代用来存放新创建的对象,默认占据堆 1/3 的空间;
  • 由于新创建对象都会在新生代申请内存区域,所以会导致新生代会频繁触发 MinorGC。

Eden 区

Eden 区是大部分 Java 对象的初始创建区域(如果新创建的对象占用内存很大,将被直接分配到老年代)。

ServivorFrom

上一次 MinorGC 的幸存者,作为这一次 MinorGC 的被扫描区域。

ServivorTo

保留 MinorGC 过程中的幸存者。

MinorGC 实现过程(复制->清空->互换)

MinorGC 采用复制算法,其具体实现原理如下:

  1. Eden、ServicorFrom 对象复制到 ServicorTo,对象年龄 + 1。首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄达到了进入老年代的标准【对象年龄为 15 】,则复制到老年代),同时把这些对象的年龄 + 1(如果 ServicorTo 内存空间不够了,对象则会被复制到老年区);
  2. 清空 Eden、ServicorFrom 中的对象。
  3. ServicorTo 和 ServicorFrom 互换。ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom 区。

老年代

  • 老年代主要存放应用程序中生命周期长的内存对象;
  • 老年代的对象比较稳定,所以 MajorGC 不会频繁执行。

老年代GC触发条件

  • 当有新生代的对象复制进入老年代,空间不够用时才触发;
  • 当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间。

MajorGC实现过程

MajorGC 采用标记清除算法,其原理如下:

  1. 首先扫描一次所有老年代,标记出存活的对象;
  2. 然后回收没有标记的对象。

关于 MajorGC有以下几点需要您注意的:

  1. 由于要扫描再回收,所以 MajorGC 的耗时比较长;
  2. MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配;
  3. 当老年代也满了装不下的时候,就会抛出 OOM(Out Of Memory)异常。`

永久代

  • 永久代指的是内存中永久保存的区域,主要存放 Class 和 Meta(元数据)的信息。
  • JVM不会在主程序运行期间对永久代进行 GC 操作。所以这也导致了永久代的区域会随着加载的 Class 的增多而胀满,最终抛出 OOM 异常。

Java8 与元数据

在 Java8 中,已经没有了永久代的概念,而是出现一个新的被称为“元数据区”(元空间)的区域。元空间的本质和永久代类似,元空间与永久代之间最大的区别在于:

  • 元空间并不在虚拟机中,而是使用本地内存;
  • 默认情况下,元空间的大小仅受本地内存限制;
  • 类的元数据放入 Native Memory,字符串池和类的静态变量放入 Java 堆中,这样可以加载多少类的元数据就不再由 MaxPermSize 限制, 而由系统的实际可用空间来控制。

JVM系列推荐

JVM01——JVM内存区域的构成

JVM02——JVM运行时内存的更多相关文章

  1. JVM 运行时内存结构

      1.JVM内存模型       JVM运行时内存=共享内存区+线程内存区 1).共享内存区       共享内存区=持久带+堆       持久带=方法区+其他       堆=Old Space ...

  2. JVM运行时内存结构

    原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...

  3. JVM运行时内存组成分为一些线程私

    JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...

  4. [转]JVM运行时内存结构

    [转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...

  5. Jvm运行时内存解析

    一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...

  6. 基础篇:JVM运行时内存布局

    目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...

  7. 详细了解JVM运行时内存

    详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...

  8. Java Core - JVM运行时内存管理

    在读正文之前,阅读以下两篇博客学习并理解堆栈.作用域.本地方法的概念. 作用域:https://www.cnblogs.com/AlanLee/p/6627949.html 操作数栈:https:// ...

  9. JVM运行时内存区域

    JVM运行java程序时会将内存划分为若干个不同的数据区域: (1)程序计数器: 1.占用内存空间不大. 2.程序计数器相当于JVM所执行的字节码(jvm指令)的“行号指示器”,通过程序计数器的“值” ...

随机推荐

  1. python后端面试第四部分:django框架--长期维护

    1 列举Http请求中常见的请求方式  https://www.cnblogs.com/andy0816/p/12360866.html2 谈谈你对HTTP协议的认识.1.1 长连接  https:/ ...

  2. python学习笔记(9)函数(一)

    定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定 ...

  3. 林轩田机器学习基石笔记4—Feasibility of Learning

    上节课介绍了机器学习可以分为不同的类型.其中,监督式学习中的二元分类和回归分析是最常见的也是最重要的机器学习问题.本节课,我们将介绍机器学习的可行性,讨论问题是否可以使用机器学习来解决. 一.Lear ...

  4. cs231n spring 2017 lecture14 Reinforcement Learning

    (没太听明白,下次重新听) 1. 增强学习 有一个 Agent 和 Environment 交互.在 t 时刻,Agent 获知状态是 st,做出动作是 at:Environment 一方面给出 Re ...

  5. cs231n spring 2017 lecture13 Generative Models

    1. 非监督学习 监督学习有数据有标签,目的是学习数据和标签之间的映射关系.而无监督学习只有数据,没有标签,目的是学习数据额隐藏结构. 2. 生成模型(Generative Models) 已知训练数 ...

  6. 使用httpclient必须知道的参数设置及代码写法、存在的风险

    转发地址:http://jinnianshilongnian.iteye.com/blog/2089792 结论: 如果使用httpclient 3.1并发量比较大的项目,最好升级到httpclien ...

  7. 转: zabbix3.2.1安装graphtrees插件

    转自 : http://blog.csdn.net/liang_baikai/article/details/53542317 graphtree介绍 由于zabbix的图像显示一块不太友好,图像没法 ...

  8. Daily Practice 2016-09-20

    算法 回文(Palindrome)数字:判断一个数字是不是回文数字,不能使用另外的空间. 提示: 负数可以是回文数字吗? 如果转为字符串需要新分配空间 你也许想到了反转数字,但反转数字可能溢出,怎样处 ...

  9. CSS中怎么设置元素水平垂直居中?

    记录怎么使用text-align与vertical-align属性设置元素在容器中垂直居中对齐.text-align与vertical-align虽然都是设置元素内部对齐方式的,但两者的用法还是有略微 ...

  10. 初学Qt——程序打包(环境vs2012+qt5.1.0)

    说来可笑,网上那么多的教程,偏偏结尾的时候就没有一个能详细的讲下关于程序的发布.开发Qt是这样,刚开始做web也是这样,因为是自学的,所以都没人可以教下,结果到了项目完成的最后总是要花费成吨的时间去查 ...