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

Posted stone2967

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了本地缓存过期时间与JVM垃圾回收相关的知识,希望对你有一定的参考价值。

背景:在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垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

详解JVM 的垃圾回收算法和垃圾回收器

JVM 垃圾回收机制

jvm 深入理解自动内存分配与垃圾回收

JVM内存管理和JVM垃圾回收机制

JVM之内存与垃圾回收篇执行引擎

JVM学习--垃圾回收机制