内存分配与回收策略

内存分配与回收策略

大家好,又见面了,我是你们的朋友全栈君。

内存分配与回收策略

对象优先在 Eden 分配

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

  • Minor GC:指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。
  • Full GC:指发生在老年代的 GC,出现了 Full GC,经常会伴随至少一次的 Minor GC,Full GC 的速度一般会比 Minor GC 慢10倍以上。

大对象直接进入老年代

大对象是指需要大量连续内存空间的 Java 对象,如很长的字符串或数据。

一个大对象能够存入 Eden 区的概率比较小,发生分配担保的概率比较大,而分配担保需要涉及大量的复制,就会造成效率低下。

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

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

JVM 给每个对象定义了一个对象年龄计数器。当新生代发生一次 Minor GC 后,存活下来的对象年龄 +1,当年龄超过一定值时,就将超过该值的所有对象转移到老年代中去。

使用 -XXMaxTenuringThreshold 设置新生代的最大年龄,只要超过该参数的新生代对象都会被转移到老年代中去。

动态对象年龄判定

如果当前新生代的 Survivor 中,相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄 >= 该年龄的对象就可以直接进入老年代,无须等到 MaxTenuringThreshold 中要求的年龄。

空间分配担保

JDK 6 Update 24 之前的规则是这样的:

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

JDK 6 Update 24 之后的规则变为:

只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小,就会进行 Minor GC,否则将进行 Full GC。

通过清除老年代中废弃数据来扩大老年代空闲空间,以便给新生代作担保。

这个过程就是分配担保。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107451.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月3日 上午9:00
下一篇 2022年4月3日 上午9:00


相关推荐

  • springboot rabbitmq 之死信队列(延迟消费消息)「建议收藏」

    springboot rabbitmq 之死信队列(延迟消费消息)

    2022年3月13日
    252
  • 认识J2SE

    认识J2SE1 J2SE 的定义 J2SE 全称为 Java2Standar Java2 平台包括 标准版 J2SE 企业版 J2EE 和微缩版 J2ME 三个版本 J2SE 主要包括 UI 集成库 语言和工具基础库 其他基础库 java 虚拟机等组件 2 面向对象 2 1 类与对象的关系 类是现实世界或者思维世界中的实体在计算机中的反映 它将数据以及这些数据的操作封装在一起 对象是具有类类型的变

    2026年3月17日
    1
  • pycharm入门使用——添加第三方库

    pycharm入门使用——添加第三方库为你的 pycharm 添加第三方库清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pypi mirrors ustc edu cn simple 华中理工大学 http pypi hustunique com 山东理工大学 http pypi sdutlinux org 豆瓣 http pypi douban com simple

    2026年3月27日
    2
  • JMM简介_英文缩写jmy啥意思

    JMM简介_英文缩写jmy啥意思Java的内存模型JMM(JavaMemoryModel)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(MainMemory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(WorkingMemory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。JM

    2025年9月13日
    8
  • silverlight技巧 获取鼠标滚轮事件 及 判断获取组合键的方法

    silverlight技巧 获取鼠标滚轮事件 及 判断获取组合键的方法

    2021年7月27日
    55
  • 公钥、密钥和数字证书

    公钥、密钥和数字证书转自 nbsp 我理解的数字证书 1 公钥 私钥和数字证书英文原文地址 http www youdzone com signature html 若下文有任何错误 请告知我 谢谢 79996286 com 主角介绍 BobandAlice 提起 RSA 加密算法 公钥和私钥 多数文章都要使用 Bob 和 Alice 这两位人物 他们的创造者名叫 Rivest 是 RSA 之父 他为了在避免在描述中

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号