java - Java - 堆栈类找不到内存泄漏
问题描述
我在一次采访中遇到了这个问题,并试图在几个小时后解决它。问题是:这个 Stack Class 有内存泄漏,找到并解决。除了达到限制时容量翻倍的事实,我找不到内存泄漏:
public class Stack {
private Object [] elements;
private int size = 0;
public Stack(int initialCapacity) {
this.elements = new Object[initialCapacity];
}
public void push(Object object) {
this.ensureCapacity();
this.elements[size++] = object;
}
public Object pop() {
if(size == 0)
throw new EmptyStackException();
return this.elements[--size];
}
private void ensureCapacity() {
if(elements.length == size) {
Object [] old = elements;
elements = new Object[2 * size + 1];
System.arraycopy(old, 0, elements, 0, size);
}
}
public static void main(String[] args) {
//Before: show memory usage
Stack stack = new Stack(10000);
for(int i = 0; i < 10000; i++)
stack.push("very large String: " + i);
for(int i = 0; i < 10000; i++)
System.out.println(stack.pop());
// After: show memory usage
}
}
解决方案
Effective Java
这是Joshua Bloch在书中给出的一个例子。内存泄漏在pop函数中,当栈顶元素被移除时,引用没有设置为null,因此不能被垃圾回收。
推荐阅读
- javascript - 如何将对象添加到 Knex 中的数据库中,其中该对象是两个父母的孩子?
- python - 如何将 wx.BitmapButton 改回原来的状态 wxpython?
- angularjs - AngularJS-$uibModalInstance 如何保持模态对话框状态像隐藏/显示而不是关闭/取消它?
- maven - 无法读取 org.apache.Maven.plugins 的工件描述符:Maven-surefire-plugin:jar:3.0.0-M3:
- javascript - 如何从 React 中的今天日期中减去日期?
- google-chrome - WebSerial API中的方法GetInfo?还有另一种获取设备信息的方法吗?
- python - 理解python列表理解
- java - 如何将 Microsoft SQL Server 2014 Management Studio 连接到 Java 程序
- python - Python 将日期类型转换为 %Y-%m-%d
- apk - 如何将文件(.jks,.p12)作为变量?