小心内存泄漏

简介: 7 消除过期的对象引用这一条建议主要讲的是要规避内存泄漏。因为像Java这种具有垃圾回收机制的语言,内存泄漏一般都是比较隐蔽的。

7 消除过期的对象引用


这一条建议主要讲的是要规避内存泄漏。因为像Java这种具有垃圾回收机制的语言,内存泄漏一般都是比较隐蔽的。


例如:

package com.wjw;
import java.util.Arrays;
import java.util.EmptyStackException;
/**
 * 2 * @Author: 小王同学
 * 3 * @Date: 2021/11/23 20:50
 * 4
 */
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)
            throw new EmptyStackException();
        return elements[-- size];
    }
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements,  2 * size + 1);
    }
}

上述代码中存在着内存泄漏,如果向栈中先添加元素再弹出元素,弹出来的对象不会被回收,因为栈内部维护着弹出对象的过期引用。

解决这个问题很简单,将出栈元素的引用设为过期即可:


29.png


内存泄漏的其他来源:


缓存

原因是被放入缓存的对象引用容易被我们遗忘。利用缓存中存储数据的价值与存储时间的长短成反比的特点,可以开一个后台线程及时清理掉失效项。


监听器和其他回调

原因是客户端在我们提供的API中注册回调,但却没有取消回调时,它们就会堆积起来。如果我们希望回调立即被回收的话可以只保留它们的弱引用(WeakHashMap中的键)。


这里还要补充一点关于WeakHashMap的知识:WeakHashMap其实是一种弱引用Map,key会存储为弱引用,当GC时,如果这些key没有外部强引用存在的话(当回调对应的强引用被不存在了时),就会被垃圾回收掉。它的这个特性也多被用来实现缓存,如果外面对某个key的引用不存在了,缓存中key对应的这一项就会被自动删除。


例如:使用WeakHashMap存储BigImage实例,key是ImageName类型,value是BigImage实例,如果令imageName = null ,这样就没有强引用指向这一个key了,BigImage实例就会在GC时被回收掉


WeakHashMap<UniqueImageName, BigImage> map = new WeakHashMap<>();
BigImage bigImage = new BigImage("image_id");
UniqueImageName imageName = new UniqueImageName("name_of_big_image"); // 强引用
map.put(imageName, bigImage);
assertTrue(map.containsKey(imageName));
imageName = null; //map中的values对象成为弱引用对象
System.gc(); //主动触发一次GC


相关文章
uni-app 124转发功能实现(四)
uni-app 124转发功能实现(四)
141 0
|
存储 自然语言处理 数据挖掘
【BERT-多标签文本分类实战】之三——多标签文本分类的方向与常用数据集介绍
【BERT-多标签文本分类实战】之三——多标签文本分类的方向与常用数据集介绍
1258 0
|
前端开发 搜索推荐 JavaScript
什么是服务端渲染?前后端分离的优点和缺点?
什么是服务端渲染?前后端分离的优点和缺点?
378 0
|
Go 开发者
多重循环应用案例(二)|学习笔记
快速学习多重循环应用案例
|
Java 数据库连接
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!(二)
各位网友,大家好,我是阿粉! 最近刚入职一个新团队,还没来得及熟悉业务,甲方爸爸就要求项目要在2个月内完成开发并上线! 本想着往后推迟1个月在交付,但是甲方爸爸不同意,只能赶鸭子上架了! 然后根据业务需求,设计出了大概30多张表,如果这30多张表,全靠开发人员手写 crud,开发所需的时间肯定会大大的延长,甚至可能直接会影响交付时间! 于是就想着,能不能通过代码生成器一键搞定全部的 crud,开发团队只需要根据业务需求编写逻辑代码就可以?
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!(二)
|
数据库 SQL 程序员
这6种编码方法,你掌握了几个?
介绍6种编码方法,看程序员如何"快速、优质、高效"地进行编码。
4790 0
这6种编码方法,你掌握了几个?
|
弹性计算 定位技术
阿里云欧洲服务器可选英国伦敦和法兰克福节点
阿里云欧洲服务器可选英国(伦敦)和德国(法兰克福)两个地域,虽然英国脱欧了,但是伦敦地理位置也算是欧洲服务器了
3201 0
|
Web App开发 安全 网络安全
SSL安全证书-概念解析
一、关于证书 数字证书是一种认证机制。简单点说,它代表了一种由权威机构颁发授权的安全标志。 由来 在以前,传统网站采用HTTP协议进行数据传输,所有的数据几乎都用的明文,很容易发生隐私泄露。为了解决安全问题,大家开始考虑采用加解密的方案,于是乎诞生了公钥加密(非对称加解密)及签名算法。
1226 0