本地缓存过期时间与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来监控新老生代的情况,而生产上则应该有动态配置或一键回滚方案。

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

时间: 2024-08-17 20:08:44

本地缓存过期时间与JVM垃圾回收的相关文章

JDK分析工具&JVM垃圾回收(转)

转自:http://blog.163.com/[email protected]/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/javase/7/docs/     ---->http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html   java命令的各种选项的说明 参考书籍: <深入理解Java虚拟机:JVM高级特性与最佳实践

JVM垃圾回收算法 总结及汇总

先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,

JVM垃圾回收算法(最全)

JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C

浅析JVM垃圾回收机制

首先我们需要知道Java的内存分配与回收全部由JVM垃圾回收机制自动完成.每种JVM实现可能采用不同的方法实现垃圾回收机制.在收购SUN之前,Oracle使用的是JRockit JVM,收购之后使用HotSpot JVM.目前Oracle拥有两种JVM实现并且一段时间后两个JVM实现会合二为一.HotSpot JVM是目前Oracle SE平台标准核心组件的一部分.市面上探讨垃圾回收机制,默认都是基于HotSpot JVM的.Ok,我们切入正题,先来看下JVM的内存区域模型, 这张图非常直观的展

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

JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采用不同的垃圾回收机制. AD: 你对JVM内存组成结构和JVM垃圾回收机制是否熟悉,这里和大家简单分享一下,希望对你的学习有所帮助,首先来看一下JVM内存结构,它是由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示. JVM学习笔记 JVM内存管理和JVM垃圾回收 JVM内存组成结构 JVM内存

JVM垃圾回收机制与算法

JVM内存由几个部分组成:堆.方法区.栈.程序计数器.本地方法栈 JVM垃圾回收仅针对公共内存区域,即:堆和方法区进行,因为只有这两个区域在运行时才能知道需要创建些对象,其内存分配和回收都是动态的. 一.垃圾回收策略 1.1分代管理 将堆和方法区按照对象不同年龄进行分代: (Young Generation and Old Generation)堆中会频繁创建对象,基于一种分代的思想,按照对象存活时间将堆划分为新生代和旧生代两部分,并不是一次垃圾回收新生代存活的对象就放入旧生代, 而是要经过几次

JVM垃圾回收 GC

一.判断对象是否存活 1.引用计数算法 给对象添加一个引用计数器,每当一个地方引用了该对象,计数器加1,:当引用失效,计数器减1.当计数器为0表示该对象已死,可回收.但是无法解决两个对象互相引用的情况 2.可达性分析算法 通过一系列称为的GC Roots对象为起点,从这些节点往下搜索,搜索走过的路径为引用链,当一个对象到GC Roots没有任何引用链相连是,即对象到GC Roots不可达,则证明对象已死,可回收 可作为GC Roots的对象包括:虚拟机栈中引用的对象,本地方法栈中Native方法

深入JVM垃圾回收机制,值得你收藏

JVM可以说是为了Java开发人员屏蔽了很多复杂性,让Java开发的变的更加简单,让开发人员更加关注业务而不必关心底层技术细节,这些复杂性包括内存管理,垃圾回收,跨平台等,今天我们主要看看JVM的垃圾回收机制是怎么运行的,希望能够帮到大家, 哪些对象是垃圾呢? Java程序运行过程中时刻都在产生很多对象,我们都知道这些对象实例是被存储在堆内存中,JVM的垃圾回收也主要是针对这部分内存,每个对象都有自己的生命周期,在这个对象不被使用时,这个对象将会变成垃圾对象被回收,内存被释放,那么如何判断这个对

JVM垃圾回收机制总结(3) :按代垃圾收集器

为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的 . 因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象.线程.Socket连接,这 类对象跟业务直接挂钩,因此生命周期比较长.但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对 象,由于其不变类的特性,系统会产生大量的这些对象,有些