本地缓存过期时间与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垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章