Java 虚拟机内存分配与回收策略
垃圾收集器与内存分配策略参考目录:
1.判断 Java 对象实例是否死亡
2. Java 中的四种引用
3.垃圾收集算法
4. Java9 中的 GC 调优
5.内存分配与回收策略
一、对象优先在 Eden 分配
在大多数的情况下,对象在新生代 Eden 区中分配内存空间。当 Eden 区没有足够的空间进行分配时,这时虚拟机将执行一次 Minor GC,由于 Eden 区没有足够的内存空间大小分配对象,对象会先考虑在新生代中的 Survivor 区分配空间,如果 Survivor 区中也没有足够的空间大小为对象分配内存,那么就会通过分配担保策略将对象提前转移到老年代中去。
二、大对象直接进入老年代
大对象是指需要大量连续内存空间的对象,最典型的就是数组以及很长的字符串。大对象对虚拟机的内存分配来说是一个坏消息,但是更糟糕的是你创建了一个生命周期很短的大对象 (这点我们在写程序时要格外的注意),因为这样容易导致内存中还有不少的空间时就得提前进行垃圾收集以腾出足够大的连续内存空间来安置大对象。
虚拟机提供了一个 -XX:PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代进行分配内存。
这样做可以可以避免在 Eden 区与两个 Survivor 区之间发生大量的内存复制 (新生代使用复制算法进行垃圾回收,如果你创建了一个大对象并且它的生命周期较长,在新生区发生垃圾回收是非常频繁的,这就意味着你创建的大对象在执行 GC 时就需要被复制很多次,这样做是非常不好的)。
三、长期存活的对象将进入老年代
虚拟机使用了分代收集的思想来管理内存,那么再进行垃圾回收时就必须能够识别哪些对象需要放在老年代,哪些对象需要放在新生代。除了大对象直接进入老年代外,虚拟机还给每个对象定义了一个对象年龄 (Age) 计数器。
它将作为新生区对象进入老年代的一个标志,如果对象在 Eden 区被分配内存并经过一次 Minor GC 后成功存活下来,并且能够在被 Survivor 区锁容纳,那么它的对象年龄就会加。
对象每“熬过”一次 Minor GC 那么它的年龄就会增加 1,这个年龄有个限制,就是当它的年龄增加到 15 岁时就会被晋升到老年代中去。这一点你可以设置这个年龄阈值,规定它的年龄超过这个阈值时就进入老年代,使用 -XX:MaxTenuringThreshold 进行设置。
四、动态对象年龄判定
当然虚拟机并不是全部要求对象的年龄必须到达 MaxTenuringThreshold 才被分配到老年代,为了更好的适应不同程序的内存情况,虚拟机还规定如果在 Survivor 中相同年龄的所有对象的大小的总和大于 Survivor 空间的一半,年龄大于或这等于该对象年龄的对象就可以直接进入到老年代。
五、空间分配担保
在执行 Minor GC 之前,虚拟机会先检查老年代中最大可用的连续空间是否大于新生代所有对象的总空间,如果这个条件成立,那么 Minor GC 就被视为是安全的。
如果条件不成立,则虚拟机会先查看 HandlePromotionFailure 设置值是否允许担保失败 (就像买了保险一样,如果你承担我执行后的风险我就执行,如果你不承担我就不执行)。
在允许的情况下,那么虚拟机会继续检查老年代中最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,那么就会尝试着进行一次 Minor GC ,尽管这次执行是有风险的,如果小于或者 HandlePromotionFailure 为不允许那么就不能执行 Minor GC 转为执行 Full GC。
这个风险指的是如果新生代中对象在执行一次 Minor GC 之后,另一块 Survivor 区无法为所有活下来的对象的拷贝分配内存,那么就会在老年代中进行内存分配,在极端的情况下,如果在老年代中也没有足够的连续的内存空间为这些对象分配内存,老年代的内存就会溢出。
六、什么时候执行 Minor GC 与 Full GC
Minor GC
当新生代中的 Eden 区分配满的时候触发。读了这篇博文你就会知道,随着 Minor GC 的执行,老年代的空间通常会随着 Minor GC 的执行内存占用空间增大。
Full GC
在将要执行 Minor GC 时如果老年代中最大可用的连续空间小新生代所有对象的总空间,这时会继续检查老年代中最大可用的连续空间是否大于历次晋升到老年代对象的平均大小。
如果大于,并且 HandlePromotionFailure 设置值为不允许,这时就执行 Full GC,或者小于,这时不管HandlePromotionFailure 设置的值是允许还是不允许那么都会执行一次 Full GC 。
如果方法区中内存填满时也会执行 Full GC ;另外 System.gc() 默认也是触发 full GC。
七、参考书籍:
《深入理解 Java 虚拟机》周志明 著
Java 虚拟机内存分配与回收策略相关推荐
- Java堆内存分配与回收策略
java主要在堆上分配内存,而Java堆又分为新生代(YoungGen)和老年代(OldGen)两个部分,新生代又再分为Eden区和Survivor区两部分,本文根据java堆的划分,描述hotspo ...
- 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...
- JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?
内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快. Full GC: ...
- 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了
点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...
- JVM之内存分配与回收策略
JVM之内存分配与回收策略 来源 https://www.cnblogs.com/xiaoxi/p/6557473.html JVM分代垃圾回收策略的基础概念 来源 https://www.cnblo ...
- 实战:内存分配与回收策略
实战:内存分配与回收策略 Java技术体系的自动内存管理,最核心的目标就是自动化的解决两个问题:内存分配和内存回收,在之前我们讲的都是内存回收,现在我们来看一下内存分配的细节,这里我是使用JDK1 ...
- JVM3:实战:内存分配与回收策略
实战:内存分配与回收策略 文章目录 实战:内存分配与回收策略 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 对象优先在Eden分配 试分配三 ...
- Java 虚拟机内存分配机制
Java 虚拟机内存分配机制 内存区域划分 对于大多数的程序员来说,Java 内存比较流行的说法便是堆和栈,这其实是非常粗略的一种划分,这种划分的"堆"对应内存模型的 Java 堆 ...
- JVM 之 内存分配与回收策略
不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/103842357] <J ...
最新文章
- 宏基因组-微生物组文章目录索引(180401)
- 麦肯锡:物联网九大应用潜力无限 2025年经济价值高达11.1万亿美元
- iOS打电话发短信发邮件总结
- HDU-5532Almost Sorted Array LIS问题
- R语言中按某个符号来分割字符串
- 苹果macOS Big Sur 11.0.1 内置原生壁纸下载!!!
- Object.HashCode()——居然是Java Native方法
- 如何查找CAD打印样式文件存储位置?
- matlab怎么把弧度换成度,matlab弧度与角度转换
- 计算机“存储容量”、“速率”(换算详解)
- 结对编程四则运算第三周-挑战出题(20172301、20172304、20172328)
- jsp页面引入调色板、颜色表
- mysql ddl 导致tmp空间溢出并报错
- excel给定一个日期,确定是本月的第几周
- 他司四大名著(zz)
- 【Faiss】PQ和IVF介绍
- 可口可乐公司将收购Costa
- 跳槽关系三国演义告诉我们的60条真理
- Web服务器与Web容器的概念
- 盘点10个一天可以收入100元的副业,让你生活多一份收入