zoukankan      html  css  js  c++  java
  • 5. 内存分配

    前面部分,我们了解了判断对象是否为垃圾对象、垃圾收集算法以及垃圾收集器,这些部分主要是针对内存回收的。Java技术体系中所提倡的自动内存管理无非就是两部分:

    a). 垃圾回收

    b). 内存分配

    我们先来看看JVM内存区域的划分:


    heap区:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。

    非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。

    内存分配策略:


    5.1 优先分配到Eden

      对象优先分配到Eden,Eden不够,就进行Scanvage GC(清理Eden区域不可达的对象,然后将可达对象移动至Survivor区域),Survivor不够,Surivivor区域的经过多次GC的对象再向老年移动

    5.2 大对象直接分配到老年代

      垃圾回收算法在新生代区域一般采用的是复制算法,如果把大对象依然放到Eden区域的话(Eden区域执行GC的频率是非常高的),那么每次执行GC都需要移动大的对象,性能是不高的,所以大对象直接放到老年代中

      虚拟机根据内存区域的不同,判定大对象的依据也不一样,我们可以根据下面参数来指定多大的对象才算大对象:

      -XX:PretenureSizeThreshold

    5.3 长期存活对象分配到老年代

      根据下面参数来判定对象存活时间是否能够进入老年代,每次GC,对象年龄+1,jdk6默认15(不同jdk版本可能不一致)

      -XX:MaxTenuringThreshold

    5.4 空间分配担保

      老年代内存分配担保时的条件:

        1.首要会衡量自己有没有能力分配。

        2.检查下面参数是否为开启状态。

        3.验证老年代最大的可用连续控件是否大于历次竞争到老年代对象的平均大小

      可根据下面参数来禁用空间分配担保(“-”禁用;“+”启用)

      -XX:-HandlePromotionFailure

    5.5 逃逸分析与栈上分配

      逃逸分析:Java虚拟机在进行对象作用域的分析(当一个对象被定义在方法体内,所受访问权限就只限于在方法体内,其引用外部成员引用后,对象就发生了逃逸),未逃逸的对象,就能分配到栈上

      栈上分配:方法调用的时候(入栈)、方法调用完毕(出栈)时,对象都不需要GC的管理,JVM会管理对象内存的分配跟释放

    HotSpot虚拟机GC算法采用分代收集算法:

    1、一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直到GC到来打破了他们平静的生活。GC会逐一问清楚每个对象的情况,有没有钱(此对象的引用)啊,因为GC想赚钱呀,有钱的才可以敲诈嘛。然后富人就会进入Survivor Space(幸存者区),穷人的就直接kill掉。

    2、并不是进入Survivor Space(幸存者区)后就保证人身是安全的,但至少可以活段时间。GC会定期(可以自定义)会对这些人进行敲诈,亿万富翁每次都给钱,GC很满意,就让其进入了Genured Gen(养老区)。万元户经不住几次敲诈就没钱了,GC看没有啥价值啦,就直接kill掉了。

    3、进入到养老区的人基本就可以保证人身安全啦,但是亿万富豪有的也会挥霍成穷光蛋,只要钱没了,GC还是kill掉。

    分区的目的:新生区由于对象产生的比较多并且大都是朝生夕灭的,所以直接采用标记-清理算法。而养老区生命力很强,则采用复制算法,针对不同情况使用不同算法。

    非heap区域中Perm Gen中放着类、方法的定义,jvm Stack区域放着方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式。

    JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?

    下一篇虚拟机工具

    原文链接:https://blog.csdn.net/zhuyucheng123/article/details/51872428

  • 相关阅读:
    P2801 教主的魔法 (分块)
    BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
    BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal)
    BZOJ_1612_[Usaco2008_Jan]_Cow_Contest_奶牛的比赛_(dfs)
    BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
    BZOJ_1026_[SCOI2009]_windy数_(数位dp)
    BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)
    BZOJ_2194_快速傅立叶之二_(FFT+卷积)
    BZOJ_1615_[Usaco2008_Mar]_The Loathesome_Hay Baler_麻烦的干草打包机_(模拟+宽搜/深搜)
    BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)
  • 原文地址:https://www.cnblogs.com/wangfajun/p/9916462.html
Copyright © 2011-2022 走看看