我是靠谱客的博主 忧伤刺猬,最近开发中收集的这篇文章主要介绍深入理解java虚拟机之自动内存分配与回收-学习笔记3,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

几条普遍的内存分配规则

  1. 对象优先在Eden区
    大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间进行分配,虚拟机会发起一次Minor GC。
    注:从内存回收的角度看,现在收集器基本上都采用分代收集算法,所以java堆中还可以细分为新生代和老年代,再细致一点,新生代又分为Eden space、From space、To space,默认比例是8:1:1,可通过虚拟机参数SurvivorRatio进行修改。在MinorGC时,会把存活的对象复制到to space区域,如果to space区域不够,则利用担保机制进入老年代区域
  2. 大对象直接进入老年代
    所谓的大对象是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组,虚拟机的内存分配不喜欢大对象,所以在平时写代码的时候,尽量避免“朝生夕灭”的“短命大对象”。虚拟机提供了一个-XX:PretenureSizeTHreshold参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免再Eden区和两个Survivor区之间发生大量的内存复制(新生代采用复制算法)。
  3. 长期存活的对象将进入老年代
    对象在Eden出生并经过一次Minor GC后仍存活,并且能够被Survivor容纳,将被移动到Survivor空间中,并且对象的年龄设置为1。对象在Survivor区中每经历一次Minor GC,年龄就+1,当年龄达到一定程度(默认15,对象头里分配了4bit来存储age属性,所以最大1111,即15),就会被晋升到老年代中,关于这个对象晋升老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold设置。
  4. 动态对象年龄判断
    为了更好的适应不同程序的内存状态,如果在Survivor空间中相同年龄所有对象那个大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入到老年代,不用非得等达到MaxTenuringThreshold中要求的年龄。
  5. 空间分配担保
    发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果成立,Minor GC是肯定安全的。如果不成立,虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。若允许,会继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均水平,如果大于,尝试进行一次Minor GC;如果小于或HandlePromotionFailure设置不允许,就要进行一次Full GC。(造成系统卡顿)
  • 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的的特性,所以Minor GC非常频繁,一般回收速度也比较快。
  • 老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(非绝对),Major GC的速度一般会比Minor GC慢10倍以上。

最后

以上就是忧伤刺猬为你收集整理的深入理解java虚拟机之自动内存分配与回收-学习笔记3的全部内容,希望文章能够帮你解决深入理解java虚拟机之自动内存分配与回收-学习笔记3所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部