内存泄漏产生的原因

1.equals()和hashcode()

定义实体时,equals()和hashcode()方法没有重写,可能会导致内存泄漏。

解决方法:始终重写这两个方法。重写时使用唯一标识区分不同对象,如用户id。hashmap尽量使用编号id作为key,不要将整个实体对象作为key存放。

2.内部类使用外部类

非静态内部类和匿名内部类创建的对象加入List集合中,外部类无法被回收,导致内存泄漏。

解决方法:使用静态内部类可以解决。

3.ThreadLocal的使用

如果使用手动创建的线程,就算没有使用remove()方法清理数据,也不会产生线程泄漏,因为当线程被回收时,ThreadLocal也被回收,但如果使用线程池就不一定。

解决方法:每次用完调用ThreadLocal的remove()方法。

4.String的intern方法

intern方法将字符串加到字符串常量池中,如果大量调用,会导致内存溢出。

解决:尽量少使用intern方法,或增加永久代空间的大小。

5.通过静态字段保存对象

大量数据在静态变量中被长期引用,数据就不会释放,如果数据不再使用,就成了内存泄露。

解决方法:1.尽量少将对象长时间保存在静态变量中,如果不再使用,必须将对象删除或将静态变量设置为null。

2.使用单例模式,尽量使用懒加载,而不是立即加载。

3.Spring的Bean中不要长期存放大对象,如果是缓存用于提升性能,尽量设置过期时间定期失效。

6.资源没有正常关闭

连接和流这些资源会占用内存,使用完没有关闭,可能会导致内存泄漏(不一定)。

解决方法:在finally块中一定关闭不再使用的资源。或者使用try-with-resources自动关闭。

相关推荐
学长毕设15 分钟前
基于SpringBoot的景点管理系统-附源码
java·spring boot·后端
sxlishaobin1 小时前
Maven Setting详解
java·学习·maven
知守观1 小时前
一个方法两个触发口:反编译 XXL-Job 后,我看清了 inner/job 子包的裸奔现状
java·spring boot·微服务
用户3126874877201 小时前
CompletableFuture 链式编排:异步编程的优雅解法
java
瑞雪兆丰年兮1 小时前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
神仙别闹2 小时前
基于 Java GUI 贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏
java·毕业设计·gui·贪心策略·极大极小博弈树
Flynn Liang3 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
SomeOtherTime3 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔3 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆3 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言