JVM系列二:GC策略&内存申请、对象衰老

发布时间:2020-06-07 10:27:57 作者:wxl604746107
来源:网络 阅读:394

JVM系列二:GC策略&内存申请、对象衰老

JVM里的GC(GarbageCollection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpotVMGC的种类

现在比较常用的是分代收集,即将内存分为几个区域,将不同生命周期的对象放在不同区域里:younggenerationtenuredgeneration和permanetgeneration。绝大部分的objec被分配在younggeneration(生命周期短),并且大部分的object在这里die。当younggeneration满了之后,将引发minorcollection(YGC)。在minorcollection后存活的object会被移动到tenuredgeneration(生命周期比较长)。最后,tenuredgeneration满之后触发majorcollection。majorcollection(Fullgc)会触发整个heap的回收,包括回收younggeneration。permanetgeneration区域比较稳定,主要存放classloader信息。

younggeneration有eden、2个survivor区域组成。其中一个survivor区域一直是空的,是eden区域和另一个survivor区域在下一次copycollection后活着的objecy的目的地。object在survivo区域被复制直到转移到tenured区。

我们要尽量减少Fullgc的次数(tenuredgeneration一般比较大,收集的时间较长,频繁的Fullgc会导致应用的性能收到严重的影响)

堆内存GC

JVM(采用分代回收的策略),用较高的频率对年轻的对象(younggeneration)进行YGC,而对老对象(tenuredgeneration)较少(tenuredgeneration满了后才进行)进行FullGC。这样就不需要每次GC都将内存中所有对象都检查一遍。

非堆内存不GC

GC不会在主程序运行期对PermGenSpace进行清理,所以如果你的应用中有很多CLASS(特别是动态生成类,当然permgenspace存放的内容不仅限于类)的话,就很可能出现PermGenSpace错误。

内存申请、对象衰老过程
一、内存申请过程

  1. JVM会试图为相关Java对象在Eden中初始化一块内存区域;

  2. 当Eden空间足够时,内存申请结束。否则到下一步;

  3. JVM试图释放在Eden中所有不活跃的对象(minorcollection次收集),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;

  4. Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;

  5. 当old区空间不够时,JVM会在old区进行majorcollection(完全收集);

  6. 完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Outofmemory错误";

JVM系列二:GC策略&内存申请、对象衰老

二、对象衰老过程

  1. 新创建的对象的内存都分配自eden。Minorcollection的过程就是将eden和在用survivorspace中的活对象copy到空闲survivorspace中。对象在younggeneration里经历了一定次数(可以通过参数配置)的minorcollection后,就会被移到oldgeneration中,称为tenuring。

  2. GC触发条件

    GC类型触发条件触发时发生了什么注意查看方式
    YGCeden空间不足

    清空Eden+fromsurvivor中所有noref的对象占用的内存
    将eden+fromsur中所有存活的对象copy到tosur中
    一些对象将晋升到old中:
    tosur放不下的
    存活次数超过turningthreshold中的
    重新计算tenuringthreshold(serialparallelGC会触发此项)

    重新调整Eden和from的大小(parallelGC会触发此项)

    全过程暂停应用
    是否为多线程处理由具体的GC决定
    jstat–gcutil
    gclog
    FGC

    old空间不足
    perm空间不足
    显示调用System.GC,RMI等的定时触发
    YGC时的悲观策略
    dumplive的内存信息时(jmap–dump:live)

    清空heap中noref的对象
    permgen中已经被卸载的classloader中加载的class信息

    如配置了CollectGenOFirst,则先触发YGC(针对serialGC)
    如配置了ScavengeBeforeFullGC,则先触发YGC(针对serialGC)

    全过程暂停应用
    是否为多线程处理由具体的GC决定

    是否压缩需要看配置的具体GC
    jstat–gcutil
    gclog
    permanentgeneration空间不足会引发FullGC,仍然不够会引发PermGenSpace错误。

调优的目的,尽可能的减少触发FGC

推荐阅读:
  1. JVM系列四:HotSpot VM GC 的种类
  2. 微信小程序异步处理的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm、gc j

上一篇:[置顶]       cocos2d-x 手游源码站

下一篇:标题 php学习遇到的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》