leakstack.java

来自「高质量Java程序设计 源代码」· Java 代码 · 共 65 行

JAVA
65
字号
package net.betterjava.memory.leak;
import java.util.EmptyStackException;

class Element {
	private byte[] data;

	public Element(int size) {
		data = new byte[size];
	}
}

public class LeakStack {
	private Object[] stack;
	private int top = -1;

	public LeakStack(int initialCapacity) {
		stack = new Object[initialCapacity];
	}

	public void push(Object e) {
		ensureCapacity();
		top++;
		stack[top] = e;
	}

	public Object pop() {
		if (top == -1)
			throw new EmptyStackException();
		Object temp = stack[top];
		stack[top] = null;
		top--; //release the reference of Element 
		return temp;
	}

	private void ensureCapacity() {
		if (stack.length == top + 1) {
			Object[] temp = stack;
			stack = new Object[2 * stack.length + 1];
			System.arraycopy(temp, 0, stack, 0, top);
		}
	}

	public static void main(String[] args) {
		try {
			int round = 1000;
			LeakStack s = new LeakStack(2000);

			for (int i = 0; i < 2; i++) {
				System.out.println("push" + i);
				for (int j = 0; j < round; j++) {
					s.push(new Element(60000));
					//System.gc();
				}

				System.out.println("pop" + i);
				for (int j = 0; j < round; j++) {
					s.pop();
				}
			}
		} catch (EmptyStackException e) {
			e.printStackTrace(System.out);
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?