对象的内存分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是百分百固定的,其细节取决于当前使用的是哪一宗垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。

对象优先在Eden分配

大多数情况下,对象在新生代的Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。

新生代GC(Minor GC):指发送在新生代的垃圾收集动作,因为Java对象大多数都具备朝生夕死的特性,所以Minor GC非常频繁,一般回收速度也较快。

老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。

大对象直接进入老年代

大对象指的是需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组。

经常出现大对象容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来安置它们。

虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区以及两个 Survivor区之间发生大量的内存复制。

PretenureSizcThreshold 参数只对Serial和ParNew两款收集器有效,Parallel Scavenge收集器不认识这个参数,Parallel Scavenge收集器一般并不需要设置。如果遇到必须使用此参数的场合,可以考虑ParNew加CMS的收集器组合。

长期存活的对象将进入老年代

虚拟机给每个对象定义了一个年龄计数器,如果对象在Eden出生并经历过第一次Minor GC后仍然存活,并且能被Survivor区容纳的话,将会被移动到Survivor空间中,并且对象年龄设为1。对象在Survivor区中每熬过一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认15岁),就将会被晋升到老年代中。对象晋升老年代的年龄阈值,可通过参数-XX:MaxTenuringThreshold设置

动态对象年龄判定

为了能更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象的年龄必须达到 字MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进大老年代,无须等到MaxTenuringThreshold中要求的年龄。

空间分配担保

在发生MinorGC之前,“虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么 会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor GC,尽管这次Minor GC是有风险的,如果小于,或者 HandlePromotionFailure设置不允许冒险,那这时也要改为进行一次Full GG。

下面解释一下“冒险”是冒了什么风险,前面提到过,.新生代使用复制收集算法,但为了内存利用率,只使用其中一个Survivor空间来作为轮换备份,因此当出现大量对象在一 次MinorGC后仍然存活的情况(最极端的情况就是内存回收后新生代中所有对象都存活),就需要老年代进行分配担保,把Survivor无法容纳的对象直接进人老年代。与生活中的贷款担保类似,老年代要进行这样的担保,前提是老年代本身还有容纳这些对象的剩余空间,一共有多少对象会活下来在实际完成内存回收之前是无法明确知道的,所以只好取之前每次回收晋升到老年代对象容量的平均大小值作为经验值,与老年代的剩余空间进行比较,决定是否进行Full GC来让老年代腾出更多空间。

取平均值进行比较其实仍然是一种动态概率的手段,也就是说,如果某次Minor GC存 活后的对象突增,远远高于平均值的话,依然会导致担保失败(Handle Promotion Failure)。如果出现了HandlePromotionFailure失败,那就只好在失败后重新发起一次Full GC。虽然担保失败时绕的圈子是最大的,但大部分情况下都还是会将HandlePromotionFailure 开关打开,避免Full GC过于频繁。

在JDK1.6之后,HandlePromotionFailure参数不会再影响到虚拟机的空间分配担保策略,之后的规则变为只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC。

深入理解Java虚拟机笔记之六内存分配与回收策略相关推荐

  1. Java虚拟机堆的内存分配和回收

    java内存分配和回收,主要就是指java堆的内存分配和回收.java堆一般分为2个大的区域,一块是新生代,一块是老年代.在新生代中又划分了3块区域,一块eden区域,两块surviver区域.一般称 ...

  2. JAVA之JVM之内存分配与回收策略(二)

    前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数 ...

  3. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  4. Java 虚拟机内存分配与回收策略

    垃圾收集器与内存分配策略参考目录: 1.判断 Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9 中的 GC 调优 5.内存分配与回收策略 一.对象优先在 E ...

  5. 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制

      Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...

  6. 深入理解Java虚拟机:jvm内存模型jdk1.8

    深入理解Java虚拟机:jvm内存模型jdk1.8 一.程序计数器 使用PC寄存器存储字节码指令地址有什么作用?为什么使PC寄存器记录当前线程的执行地址? PC寄存器为什么会被设定为线程私有? 二.J ...

  7. 深入理解java虚拟机-1.自动内存管理

    文章目录 1.自动内存管理 1.1 Java内存区域与内存溢出异常 1.1.1 运行时数据区域 程序计数器 程序计数器为什么是私有的? java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈为什么是私有的 ...

  8. 深入理解Java虚拟机 笔记

    对象内存布局: 对象头 实例数据 对齐填充 对象头: Mark Word:存储自身的运行时数据,如hashcode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳 类型指针,指向其类 ...

  9. 深入理解java虚拟机 新生代_深入理解java虚拟机:笔记

    1.运行时数据区域 1.程序计数器 当前线程执行字节码的行号指示器,字节码解释器工作通过改变这个计数器的值来选取下一条需要执行的字节码指令,每一个线程拥有独立的程序计数器,线程私有的内存 2.虚拟机栈 ...

最新文章

  1. 高压发生器的输出电压波形
  2. 【剑指offer-Java版】30最小的K个数
  3. IIS7中的站点、应用程序和虚拟目录详细介绍
  4. Android Studio 打包、生成jks密钥、签名Apk、多渠道打包
  5. ML之分类预测:分类预测评估指标之AUC计算的的两种函数具体代码案例实现
  6. 1155 Heap Paths (30 分)【难度: 一般 / 知识点: 堆 堆的遍历】
  7. 【机器学习基础】数学推导+纯Python实现机器学习算法27:EM算法
  8. 查看swintransformer的网络结构.children()
  9. dns 服务器无法从应用程序目录分区,DNS 区域不随事件 4000 和 4007 一起加载 - Windows Server | Microsoft Docs...
  10. qdialog 只有点击才能获得焦点_4 个突破点,让你的 Banner 点击率提升10倍
  11. linuxSAMBA共享
  12. 一个R包完成单细胞基因集富集分析 (全代码)
  13. 转行进入互联网的一条可行路径
  14. 【kafka】kafka 如何查看 内部 磁盘 网络 是否繁忙
  15. mysql查询结果添加序号
  16. JavaScript(3)——Object-Oriented Design
  17. linux 文本筛选基因,linux – 如何将snps映射到ref基因文件
  18. 如何利用 XMind 高效学习?
  19. 猫眼api html,猫眼电影数据抓取
  20. SLAM综述论文:Past, Present, and Future of SLAM: Towards the Robust-Perception Age

热门文章

  1. 指静脉到底是噱头还是真香 鹿客SV40指静脉智能锁初体验
  2. 西卡编程教学 C语言教学视频(共32课更新完毕) - 『 西卡教学 』 - 西卡学院 - Powered by Pureing Labs!...
  3. 巅峰对决!2021“创芯中国”集成电路创新挑战赛诸暨总决赛冠军已诞生!
  4. Postgres-XL 10 使用介绍(一)
  5. mysql 集群 grra_Oracle RAC 导致实例驱逐的五大原因[ID 1526186.1]
  6. C# 实现医学影像 DICOM 工作站(1):项目介绍
  7. 新手商家做Shopee的马来站点有什么运营技巧,快速上手教程
  8. 电销外呼系统,智能电销系统哪家好?
  9. 【撷英采华】学员日考题-071801
  10. Excel导入长数据末尾变000