Java 堆从GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和To Survivor 区)和老年代。

新生代

是用来存放新生的对象。一般占据堆的1/3 空间。由于频繁创建对象,所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、ServivorTo 三个区。

1、Eden区

Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden 区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。

2、ServivorFrom

上一次GC 的幸存者,作为这一次GC 的被扫描者。

3、ServivorTo

保留了一次MinorGC 过程中的幸存者。

4、MinorGC 的过程(复制->清空->互换)

MinorGC 采用复制算法。

1、eden、servicorFrom、ServicorTo,年龄+1
首先,把Eden 和ServivorFrom区域中存活的对象复制到ServicorTo 区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果ServicorTo 不够位置了就放到老年区);
2、清空eden、servicorFrom
然后,清空Eden 和ServicorFrom 中的对象;
3、ServicorTo 、ServicorFrom互换
最后,ServicorTo 和ServicorFrom 互换,原ServicorTo 成为下一次GC 时的ServicorFrom区。

老年代

主要存放应用程序中生命周期长的内存对象。
老年代的对象比较稳定,所以MajorGC 不会频繁执行。在进行MajorGC 前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC 进行垃圾回收腾出空间。
MajorGC 采用标记清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC 的耗时比较长,因为要扫描再回收。MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

永久代

指内存的永久保存区域,主要存放Class 和Meta(元数据)的信息,Class 在被加载的时候被放入永久区域,它和存放实例的区域不同,GC 不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class 的增多而胀满,最终抛出OOM异常。

以点破面——JVM运行时内存相关推荐

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

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

  2. java runtime类 heap_Java 进阶(一) JVM运行时内存模型

    1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果 ...

  3. JVM运行时内存概念-堆栈及新生代、老年代、持久代

    JVM内存有一些按不同标准划分的概念,这里来理清一下. 一.首先java虚拟机规范定义了java运行时数据区在概念上应该有的分区,这是抽象概念不对应也不限制物理上的具体实现,不同的虚拟机可以有不同的实 ...

  4. 尝试用HSDB分析JVM运行时内存理解Java多态实现机制

    测试代码 // 接口 package ziya; public interface TestParent {void show(); }package ziya; public class Paren ...

  5. 在没有任何数据时进行无效的读取尝试。_技术转载——JVM运行时内存是怎么分布的?...

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/ ...

  6. 三年Java开发,你连基础的JVM运行时内存布局都忘了

    面:为什么要使用双亲委派机制去加载类? 答:避免多份同样字节码的加载,浪费内存. 类的加载方式 隐式加载:new 显示加载:loadClass.forName等 类的装载过程如下图: 面:loadCl ...

  7. JVM运行时内存分区

    什么是JVM?JVM概述--初识JVM(类加载器,垃圾回收器,执行引擎) 上一篇博客我们对jvm以及它的三个"部件"有了初步的认识,这一篇我们探讨一下源码经过编译.加载后这些数据被 ...

  8. JVM 运行时内存空间详解——元空间

    通过上一篇文章,我们大体了解了JVM的整体架构,其分为:元数据(JDK7是方法区).堆.虚拟机栈.本地方法栈.程序计数器几个部分. 本篇文章,咱们对元空间进行剖析,一探究竟. 1. 元空间介绍 在JD ...

  9. JVM运行时内存结构学习

    学习JVM运行模型比较重要,先看一幅图片: 运行时数据区(内存结构) :  1.方法区(Method Area) 类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义.简单来说, ...

最新文章

  1. CALayer( 一 )
  2. 分享一个BookStore ios程序的例子
  3. 【Java自顶向下】HashMap面试题(2021最新版)
  4. 如何设置谷歌浏览器在新窗口中打开搜索链接
  5. Windows上Python3.5安装Scrapy(lxml) 以及与twisted有关错误的解决
  6. 分享微信朋友或朋友圈
  7. 实操教程 | 深度学习pytorch训练代码模板(个人习惯)
  8. 微信抢红包插件与Android辅助功能
  9. (Windows) CodeBlocks 下载
  10. android手机打电话时没有网络,4G手机打电话为什么会断网 4G上网和通话不能并存原因分析...
  11. 腾讯互娱推出 PGOS 提供 Serverless 游戏上云
  12. filp/whoops初体验
  13. win7计算机自动关机设置在哪里设置方法,win7自动关机命令是什么 怎么设置
  14. 用Excel生成Ansys *VREAD函数所需的具有固定字符长度和小数位数的数据
  15. Oracle中的TIMESTAMP类型解读(TIMESTAMP存储格式)
  16. 无炫技:纯粹的Bert和Roberta
  17. 服务器阵列信息恢复,DELL RAID阵列的创建恢复回原有的用户数据
  18. 鸿蒙系统研究之六:U-Boot引导
  19. Qt编译32位和64位程序
  20. 当前页的脚本发生错误 ,缺少对象

热门文章

  1. iOS开发之头像裁剪
  2. 说说N卡掉驱动 / 黑屏风扇狂转的事
  3. 产品介绍公司宣传PPT模板
  4. 【Qt+FFmpeg】视频转码详细流程
  5. HTML:一种标记语言而不是编程语言(6.0)
  6. 【Effective Objective-C 2.0读书笔记】第六章:块(Blocks)和大中枢派发(GCD)
  7. python实验四:聚类模型KMeans算法及其评价
  8. MySQL基础到高级
  9. gif动图怎样裁剪?如何裁剪不影响画质?
  10. const常量函数详解