1.模型


堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包含 Eden+Survivor 区,survivor 区里面分为 from 和 to 区.

内存回收时,如果用的是复制算法,从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动到老年区.

当 JVM 内存不够用的时候,会触发 MajiorGC,清理 JVM 老年区.

当新生区满了之后会触发 YGC(MinorGC),先把存活的对象放到其中一个 Survice区,然后进行垃圾清理。

因为如果仅仅清理需要删除的对象,这样会导致内存碎片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候,就会使用下一个Survive,这样循环使用。

如果有特别大的对象,新生代放不下,就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存活时间一般比较久远。

2.概念解释

1.新生代

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

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

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

MinorGC 的过程(采用复制算法,复制->清空->互换)

2.老年代

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

在进行 MajorGC 前一般都先进行了一次 MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。

当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间。

MajorGC 采用标记清除算法:
首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出 OOM(Out of Memory)异常.

3.永久代(方法区)

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

JDK 8之前,堆和方法区其实是连在一起的,或者说,方法区就是堆的一部分。

在过去自定义类加载器使用不普遍的时候,类几乎是“静态的” 并且很少被卸载和回收,因此类也可以被看成 “永久的”(这也就是永久代的含义),另外由于类作为JVM实现的一部分,它们不由程序来创建,所以为了和堆区分开来呢,就给了 “方法区” 这样一个名字用来存储类的信息。

在JDK 8之前,方法区的具体实现方法是永久代,永久代是HotSpot虚拟机给出的实现,但是对于其他虚拟机实现,譬如BEA JRockit、IBM J9等来说,是不存在永久代的概念的。

4.元空间(方法区)

在 Java8 中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。

元空间的本质和永久代类似,元空间与永久代之间最大的区别在于:元空间不再与堆连续, 即不在虚拟机中,而是存在于本地内存(Native memory)中的。

因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据就不再由MaxPermSize 控制, 而由系统的实际可用空间来控制。

02-JVM堆里面的分区:Eden,survival (from+ to),老年代,各自的特点?相关推荐

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

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

  2. 深入理解Java虚拟机(四)Eden、Survivor、老年代、GC日志

    1. 年轻代 1.1 Eden区和Survivor区 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,Minor GC非常频繁,新生代采用复制算法,一般回收速度也比较快.因为采用复制算法 ...

  3. 16-内存分配与回收策略-对象优先分配Eden+大对象进老年代

    1.对象优先在Eden分配 大多数情况下, 对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC.HotSpot虚拟机提供了-XX: +PrintGC ...

  4. 深入理解JVM—满足什么条件的对象才会进入老年代?

    我们可能知道jvm调优,但是jvm调优到底是为了调整什么呢?或者说是优化什么?可能并不是特别清楚. 其实很简单,就是为了减少STW(stop the world),什么会造成这一现象呢,学过gc的应该 ...

  5. JVM堆内存(新生代,老年代,Xms,Xmx)学习整理

    JVM堆内存 jvm堆内存主要分为新生代和老年代,当垃圾收集器触发GC的时候会对堆内存长时间没用的对象分代进行回收,新生代和老年代内存占比为1:2. 文章目录 JVM堆内存 新生代 1.Eden区 2 ...

  6. JVM堆内存与垃圾收集器

    3.1 谈谈Java中不同的引用类型? Java里有不同的引用类型,分别是强引用.软引用.弱引用和虚引用; 强引用:Object object = new Object();即使内存溢出了也不会回收这 ...

  7. JVM堆内存(heap)

    堆的核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域. Java堆区在JVM启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大1块内存空间.堆内存的大小是可以调节的 ...

  8. Java JVM堆空间的概述

    Java JVM堆空间的概述 1.设置堆空间初始值和最大值 2.堆的核心概述 内存细分 3.堆空间大小的设置 4.新生代与老年代 5.图解对象分配的过程 6.常用调优工具 7.Minor GC.Maj ...

  9. 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...

  10. JVM堆内存介绍、垃圾收集算法、垃圾回收器汇总

    目录 1. JAVA堆内存是如何划分的 1.1 为什么移除永久代? 1.2 分代概念 1.3 为什么分代? 1.4 为什么survivor分为两块相等大小的幸存空间? 1.5 JVM堆内存常用参数 2 ...

最新文章

  1. HTML5column属性布局页脚,利用column多列属性调整页面文字列布局
  2. kali设置中文_kali安装教程
  3. python datatime 平均值_python求数据的时间平均
  4. python中的键不允许重复_为什么python允许您使用重复键创建字典
  5. Linux驱动下的platform总线架构(转)
  6. 数据处理中的过采样、下采样、联合采样和集成采样
  7. 【泡泡图灵智库】基于优化的视觉惯性SLAM与GNSS紧耦合
  8. 程序员常用刷题网站分享
  9. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
  10. 计算机课学生电脑怎么打开任务管理器,Win7系统电脑打开任务管理器的几种方法-电脑自学网...
  11. 解决无法在设置线程模式后对其加以更改问题:2147549446(0x80010106)
  12. GitHub已标星72K阿里内部878页性能优化笔记限时免费
  13. openlayers绘制箭头线
  14. 计算机如何打开无线网络适配器,电脑WIFI网络适配器卡怎么启用
  15. 机器学习实战课后习题(八)
  16. 各大网商店铺历史价格分析原理
  17. mysql groupby rullup_group by后加rollup子句的用法
  18. connectify
  19. oracle建新用户
  20. Office2003与2007完美共存的办法

热门文章

  1. 苹果 iOS 10 更新消息汇总,iPhone 4s 可能用不了
  2. selenium最新各浏览器driver驱动下载地址
  3. IDEA phpstorm插件CamelCase 【大小写,下划线,驼峰,首字母大写等转化工具】
  4. 高级加密标准 (AES) 和安全断言标记语言 (SAML) 的 Web 安全
  5. 哔哩哔哩bilibili 直播间全屏发弹幕
  6. 聊城大学计算机专业全国排名,2021年聊城大学排名,附全国最新排名
  7. 计算机如何添加gust用户,如何为自己的电脑创建一个guest账户?
  8. scrapy自定义扩展(extensions)实现实时监控scrapy爬虫的运行状态
  9. 51Nod 1737 配对
  10. 最新开源版知音QQ助手V1.0.16版本