讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Java缓存数据读取失败:静态变量与单例模式的陷阱及解决方案?

落丽酱_7811

落丽酱_7811

发布时间:2025-03-13 19:40:15

|

447人浏览过

|

来源于php中文网

原创

java缓存数据读取失败:静态变量与单例模式的陷阱及解决方案?

Java缓存数据读取失败:避免静态变量和单例模式的陷阱

Java应用中,缓存大量数据以提升性能是常见做法。然而,有时会遇到从缓存中读取数据失败的问题。本文分析一个案例,探讨导致Java缓存数据读取失败的原因,并提供解决方案。

案例:内存不足导致缓存数据丢失

开发者使用scenariobuffer类将约16万条资产数据加载到名为assetbuffer的HashMap中。getbasset方法用于读取缓存数据。在服务器内存不足(可用内存仅剩100MB,缓存占用3GB,总内存8GB)时,getbasset方法返回空值。重启服务器并清除缓存后,问题解决。项目使用Tomcat启动,分配约3GB内存。代码如下:

立即学习“Java免费学习笔记(深入)”;

@Component
@Order(1)
@Slf4j
public class scenariobuffer implements IActionListener, ApplicationRunner {
    private static Map<String, List<Asset>> assetbuffer = Collections.synchronizedMap(new HashMap<>());
    private static scenariobuffer instance = new scenariobuffer();

    public static scenariobuffer getinstance() {
        return instance;
    }

    public static List<Asset> getbasset(String groupid) {
        if (assetbuffer.containsKey(groupid)) {
            return assetbuffer.get(groupid);
        }
        return null;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        IAssetService assetService = SpringUtil.getBean(IAssetService.class);
        List<Asset> assetlist = assetService.list();
        assetbuffer.put("key", assetlist);
    }
}

问题分析与解决方案

问题并非单纯的内存不足导致JVM清空数据,而是代码设计缺陷:

  1. 不当使用static和getinstance(): scenariobuffer类使用static关键字,使其成为单例。但getinstance()方法冗余,因为Spring容器已保证@Component注解的Bean是单例的。static关键字导致assetbuffer成为静态变量,生命周期与应用服务器相同,即使JVM垃圾回收,也难以回收其内存。

  2. 不推荐的Bean获取方式: 使用SpringUtil.getBean(IAssetService.class)获取Bean,不推荐。Spring框架推荐使用@Autowired或@Resource注解进行依赖注入。

  3. 初始化时机问题: 使用ApplicationRunner接口在应用启动时初始化缓存,但更好的方式是使用@PostConstruct注解或实现InitializingBean接口,使初始化过程更明确可控。

改进后的代码

修改scenariobuffer类及其使用方法:

@Component
public class scenariobuffer implements IActionListener {
    private Map<String, List<Asset>> assetbuffer = new HashMap<>();

    @Autowired
    private IAssetService assetservice;

    @PostConstruct
    public void init() {
        List<Asset> assetlist = assetservice.list();
        assetbuffer.put("key", assetlist);
    }

    public List<Asset> getbasset(String groupid) {
        return assetbuffer.get(groupid);
    }
}

在其他服务类中,使用@Resource注解注入scenariobuffer:

@Service
public class XxxService {
    @Resource
    private ScenarioBuffer scenarioBuffer;

    public void xxx() {
        List<Asset> asset = scenarioBuffer.getBAsset("xxx");
    }
}

改进后,避免了不必要的静态变量和单例获取方法,利用Spring框架的依赖注入机制和@PostConstruct注解,使代码更清晰、易于维护,并减少了内存泄漏的风险。即使服务器内存紧张,JVM垃圾回收机制也能更有效工作,降低缓存数据读取失败的可能性。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

945

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

509

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Tomcat核心原理解析
Tomcat核心原理解析

共57课时 | 9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn