groovy PermGen Full GC 问题 解决

线上环境  用来生成脚本的 结果 没几天就fullGC 并且持续很长时间,才降下来,  

groovy 常见的三种引入方式都会有对应的问题,:

相应的解决办法:

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.4.7</version>
</dependency>


//清除groovy 里面的缓存, 防止fullGC,也可以定时来做
GroovyClassLoader groovyClassLoader = engine.getClassLoader();
Class[] classes = engine.getClassLoader().getLoadedClasses();
for (Class clazz : classes) {
    GroovySystem.getMetaClassRegistry().removeMetaClass(clazz);
    groovyClassLoader.clearCache();
    try {
        Field globalClassValue = ClassInfo.class.getDeclaredField("globalClassValue");
        globalClassValue.setAccessible(true);
        GroovyClassValue classValueBean = (GroovyClassValue) globalClassValue.get(null);
        classValueBean.remove(clazz);

    } catch (Throwable e) {

    }
}
groovyClassLoader.clearCache();
ClassInfo.clearModifiedExpandos();
/**
 * Using java beans (e.g. Groovy does it) results in all referenced class infos being cached in ThreadGroupContext. A valid fix
 * would be to hold BeanInfo objects on soft references, but that should be done in JDK. So let's clear this cache manually for now,
 * in clients that are known to create bean infos.
 */
Introspector.flushCaches();

### AdClickCache 技术实现 AdClickCache 是一种用于缓存广告点击数据的技术方案,旨在提高系统性能并减少数据库查询次数。通常情况下,该机制会存储最近的点击记录以便快速访问。 #### 缓存结构设计 为了高效管理广告点击信息,AdClickCache 可能采用如下方式构建: - **键值对形式**:每个条目由唯一标识符(如广告ID加时间戳组合)作为key,对应的value则保存实际的数据内容。 - **过期策略**:设置合理的TTL (Time To Live),确保陈旧或不再需要的信息能够及时清除,防止内存泄漏[^1]。 ```java // Java伪代码展示如何定义带有TTL功能的缓存项 public class CacheItem<T> { private final T value; private final long expiration; public CacheItem(T value, Duration ttl) { this.value = value; this.expiration = System.currentTimeMillis() + ttl.toMillis(); } boolean isExpired() { return System.currentTimeMillis() > expiration; } } ``` #### 数据一致性保障措施 考虑到分布式环境下的并发读写操作可能导致的竞争条件问题,需引入同步控制手段来维护内部状态的一致性。例如,在更新特定广告点击计数器时应采取原子化指令完成增减动作;对于涉及多个资源协调的任务,则可以考虑利用乐观锁或者事务型API接口处理。 ### 常见问题及其应对方法 当遇到与AdClickCache有关的问题时,可以从以下几个方面着手排查和修复: - **内存溢出错误** 如果观察到JVM频繁发生Full GC事件,并伴随有PermGen空间耗尽的现象,这可能是由于Groovy每次执行新实例化的`InnerLoader`未能正常释放所引起的。针对此类情况建议调整垃圾收集参数配置,适当增加永久代大小限制或是迁移到支持类元空间的新版本Java平台之上。 - **缓存穿透攻击防护** 恶意请求试图绕过现有过滤逻辑直接命中底层持久层会造成严重的负载压力。为此可以在入口处部署布隆过滤器预先筛除不存在于任何合法范围内的非法输入;同时设定兜底返回默认响应体以阻止异常流量继续向下游传递。 - **热点数据集中访问引发雪崩效应** 某些高频率交互场景下可能会造成部分热门商品/页面瞬间涌入大量相似类型的请求数量激增。此时可借助限流算法比如令牌桶模型合理分配服务端口带宽配额;另外通过异步队列解耦生产者消费者角色关系也是不错的选择之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值