第六条:消除过期的对象引用

本文通过一个简单的Java栈实现示例,揭示了内存泄漏的原因及其解决方案,并进一步讨论了缓存和监听器等常见内存泄漏来源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了直观,我们先上代码,哈哈哈哈哈:

public class Stack {
    private Object[] elements;
    
    private int size  = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    
    public Stack(){
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    public void push(Object e){
        ensureCapacity();
        elements[size++] = e;
    }
    
    public Object pop(){
        if (size==0) {
            ensureCapacity();
        }
        return elements[--size];
    }
    
    private void ensureCapacity(){
        if(elements.length==size){
            elements = Arrays.copyOf(elements,2*size + 1);
        }
    }
}

上面代码没有明显的错误,也许数据量小的话,根本就不会出现什么问题。

但是代码里隐式的存在一个内存泄漏,随着数据量的不断增加,程序越来越慢,最后就会发生内存泄漏,

那内存泄漏发生在哪里呢?

如果栈先是增长,然后再收缩,那么从栈中弹出来的对象将不会当作垃圾回收,即使栈不在引用这些对象。

因为栈内部还维护者对这些对象的过期引用,所以垃圾回收期永远也不会去回收那些没有用的数据,随着时间越来越久,

总有一天会发生内存泄漏,解决办法,就是修改pop方法:

public Object pop() {
        if (size == 0) {
            ensureCapacity();
        }
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }

将栈中取出的对象置为null,这样GC回收器就会去回收过期对象。

内存泄漏的另外一个常见来源是缓存,一旦你把对象引用存放在缓存中,它就很容易被遗忘掉,从而之后的很长一段时间任然留在缓存中。如果你要实现这样的缓存:只要在缓存之外存在对某个项的键的引用,该项就有意义,那么可以使用WeakHashMap代表缓存,当缓存中的项过期后,他们会自动删除。记住只有当所要的缓存项的生命周期是由该键的外部引用而不是由值决定时,WeakHashMap才有用处。

我们的缓存随着时间的推移,越早加入的缓存数据,会变得越来越没有价值,在这种情况下,缓存应该时不时的清除掉没用的项,这种清除工作可以由一个后台线程(Timer,quartz或者ScheduledThrealPoolExecutor)来完成,或者也可以在给缓存添加新条目的时候顺便进行清理,LinkedHashMap可以利用它的removeEldestEntry方法可以很容易的实现后一种方案,对于更复杂的缓存可以直接使用java.lang.ref。

内存泄漏的第三个常见的来源的是监听器和其他回调。可以借助Heap剖析工具Heap Profiler 来查看内存泄漏的情况。

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值