第六条:消除过期的引用变量

    xiaoxiao2025-11-06  7

    为什么要消除过期的引用变量:

    因为JAVA是用垃圾收集机制回收内存的。

    当只有在变量未被任何类使用的情况下才会被回收。但是当我们编写程序的时候,往往会无意识的保持对象。

    导致垃圾回收机制无法回收,引发内存泄漏。

    一、未消除引用变量的例子

    用数组创建栈。

    public class Stack { private static final int SIZE = 16; private static final Test [] STACK = new Test[SIZE]; private static int loc = 0; public void add(Test data){ STACK[loc] = data; ++loc; } public Test pop(){ Test data = STACK[loc]; --loc; return data; } }问题在pop()方法中,当出栈的时候我们获取的test实例,并返回。但是其实Test的引用还保留在STACK数组中。

    保留在STACK数组中的变量称为过期变量。数组会保持这种过期变量。导致垃圾回收机制无法回收。

    二、解决办法。

    不让数组持有该变量的引用。

    所以就是加上

    STACK[loc] = null;//让引用清零。

    三、常见的内存泄漏问题

    将数据放到缓存中。然后缓存的数据不再被使用。导致缓存无法被回收,导致泄漏。

    如果缓存的生命周期是根据其键值来的那么就可以使用WeakHashMap。

    WeakHashMap:当key被回收的时候,那么它的value也会被回收。

    转载请注明原文地址: https://ju.6miu.com/read-1303899.html
    最新回复(0)