TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
java向程序员许下了一个美好的承诺:JAVA程序员无需关心内存释放的问题,JVM的垃圾回收机制会自动回收无用对象所占用的内存空间,这易产生一个错觉:JAVA程序不会有内存泄漏。但实际上,如果使用不当,
JAVA程序一样会有内存泄漏的问题存在。

例:
- public class Stack
- {
- //存放栈内元素的数组
- private Object[] elementData;
- //记录栈内元素的个数
- private int size = 0;
- private int capacityIncrement;
- //以指定初始化容量创建一个Stack
- public Stack(int initialCapacity)
- {
- elementData = new Object[initialCapacity];
- }
- public Stack(int initialCapacity , int capacityIncrement)
- {
- this(initialCapacity);
- this.capacityIncrement = capacityIncrement;
- }
- //向“栈”顶压入一个元素
- public void push(Object object)
- {
- ensureCapacity();
- elementData[size++] = object;
- }
- public Object pop()
- {
- if(size == 0)
- {
- throw new RuntimeException("空栈异常");
- }
- return elementData[--size];
- }
- public int size()
- {
- return size;
- }
- //保证底层数组能容纳栈内所有元素
- private void ensureCapacity()
- { //增加堆栈的容量
- if(elementData.length==size)
- {
- Object[] oldElements = elementData;
- int newLength = 0;
- //已经设置capacityIncrement
- if (capacityIncrement > 0)
- {
- newLength = elementData.length + capacityIncrement;
- }
- else
- {
- //将长度扩充到原来的1.5倍
- newLength = (int)(elementData.length * 1.5);
- }
- elementData = new Object[newLength];
- //将原数组的元素复制到新数组中
- System.arraycopy(oldElements , 0 , elementData , 0 , size);
- }
- }
- public static void main(String[] args)
- {
- Stack stack = new Stack(10);
- //向栈顶压入10个元素
- for (int i = 0 ; i < 10 ; i++)
- {
- stack.push("元素" + i);
- }
- //依次弹出10个元素
- for (int i = 0 ; i < 10 ; i++)
- {
- System.out.println(stack.pop());
- }
- }
- }
复制代码 上面程序实现了一个简单的Stack,并为这个Stack实现了push(),pop()两个方法,其中pop()方法可能产生内存泄漏。程序main方法创建了一个Stack对象,先压入10个元素,此时底层elementData数组的长度为10,每个数组元素都引用一个字符串。
接下来,程序10次调用pop()弹出栈顶元素,它只做了两件事:
1、修改了Stack的size属性,也就是记录栈内元素减1;
2、返回clementData数组中索引为size-1的元素,但并未清除elementData数组最后一个元素的引用,这样就会产生内存泄漏。
- 应修改为:
- public Object pop()
- {
- if(size == 0)
- {
- throw new RuntimeException("空栈异常");
- }
- Object ele=elementData[--size];
- //清除elementData数组最后一个元素的引用
- elementData[size]=null;
- return ele;
- }
复制代码 |
|