码迷,mamicode.com
首页 > 其他好文 > 详细

本地缓存过期时间与JVM垃圾回收

时间:2019-02-15 18:14:38      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:背景   动态   范围   很多   tac   内存   应该   活动   问题   

背景:在mo的业务中,调整更长的本地缓存的有效时间,可以一定程度减少主动回源的次数,并减少YGC的频率,但是也可能会有一些新问题。

 

首先要知道:

1.JVM中的堆内存是一个可以被一个进程内的所有线程共享的,而本地缓存一般就放在这块堆内存上。

2.堆内存一般分为新生代、老生代和永久代,永久带是方法区,不在本次讨论范围内。

3.YGC发生在新生代(创建新对象,空间不够时触发),FGC发生在老生代(老生代满了才触发)。

4.无论YGC还是FGC,都只清除JVM认为是垃圾的对象。

5.新生代又分为eden区 和S0,S1区 (S即survivor),默认的比例为8:1:1,当新生代中的对象经历过若干次YGC而存活,将被放入老生代(或者大对象创建时就直接进入老生代,如布局缓存)。

 

mo布局/活动规则/时间轴/菜单信息/菜单信息规则等 本地缓存,现在有效时间为30~60mins,如果调整为更长,如240~360min,带来的好处:

1.减少了主动回源redis的次数;

2.因为这些缓存对象,变更的频率并不大,可以减少YGC回收垃圾的频率;

 

但是观察mercury发现,moapi每20min就要进行一次YGC,大概3~4天进行一次FGC:

1.按照YGC的频率,调整过长的有效时间,会导致很多本地缓存进入老生代,这些本地缓存在老生代中过期后成为垃圾,新的缓存对象又逐渐加进来,导致老生代中内存不足,导致FGC。

2.按照1中的设想,这样调整以后,会导致FGC的频率变高,同时老生代中的垃圾变多,会一定程度上的加长FGC的耗时(当然FGC耗时更大决定于分配的老生代的大小)。

 

所以,本地缓存的过期时间应该有一个调优的过程,在测试环境中,可以通过jstack来监控新老生代的情况,而生产上则应该有动态配置或一键回滚方案。

本地缓存过期时间与JVM垃圾回收

标签:背景   动态   范围   很多   tac   内存   应该   活动   问题   

原文地址:https://www.cnblogs.com/stone2967/p/10384804.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!