Так что я недавно попытался реализовать Stack, используя один связанный список в Java, и у меня есть эта проблема. Если я нахожу 100000 элементов в стек естественно, память увеличивается, потому что стек требует 100000 узлов для хранения объектов. Однако, когда стек опустошается (после 100 000 pops), ссылки на эти Узлы и их содержимое должны выпадать из объема, поэтому, если стек заполняет резервную копию, использование памяти не должно расти. Однако, когда это происходит в моем коде, память удваивается. Другими словами, поп, похоже, недостаточно удаляет ссылки или не допускает сбор мусора, и я надеюсь, что кто-то скажет мне, почему.Ошибка утечки памяти Java Stack
Вот класс стека
public class Stack<T> {
private Node<T> top;
private int size;
private long limit;
public boolean isEmpty() {
return this.size == 0;
}
public void setStackLimit(long limit) {
this.limit = limit;
}
public int size() {
return size;
}
public Stack() {
this(1000L);
}
public Stack(long limit) {
this.size = 0;
this.top = null;
this.limit = limit;
}
public void push(T o) throws StackOverflowException{
if (this.size == this.limit) throw new StackOverflowException("The stack overflowed");
if (this.top == null) this.top = new Node<T>(o);
else {
Node<T> r = new Node<T>(o);
Node<T> temp = this.top;
this.top = r;
this.top.setNext(temp);
}
this.size++;
}
@SafeVarargs
public final void mpush(T... o) throws StackOverflowException{
for (T ob: o) {
this.push(ob);
}
}
public T pop() throws EmptyStackException{
if (this.top == null) throw new EmptyStackException("The stack is empty");
else {
T o = this.top.getPayload();
this.top = this.top.getNext();
this.size--;
return o;
}
}
public boolean empty() {
while (!this.isEmpty()){
try {
this.pop();
}
catch (Exception e) {
return false;
}
}
return true;
}
public String printStack() {
String stack = "";
Node<T> temp = this.top;
while (temp != null){
if (temp.getPayload() instanceof Stack<?>) {
Stack<?> stack2 = (Stack<?>)temp.getPayload();;
stack = "| " + stack2.printStack() + stack;
} else
stack = "|" + temp.getPayload().toString() + stack;
temp = temp.getNext();
}
return stack.replaceAll("[| ]$","");
}
public T peek() throws EmptyStackException {
if (this.top == null) throw new EmptyStackException("The stack is empty");
else {
T o = this.top.getPayload();
return o;
}
}
public boolean isFull() {
return this.size == this.limit;
}
public Object[] toArray() {
Object[] returnvalue = new Object[this.size];
int index = this.size-1;
Node<T> temp = this.top;
while (index >= 0) {
returnvalue[index--] = temp.getPayload();
temp = temp.getNext();
}
return returnvalue;
}
public String toString() {
try {
return "<Stack object of size " + this.size() + " last element: " + this.peek().toString() + ">";
} catch (Exception e) {
return "<Empty stack object of size " + this.size() + ">";
}
}
}
и здесь является реализация узла
public class Node<T> {
private T payload;
private Node<T> next;
public Node(T payload) {
this.payload = payload;
}
public Node<T> getNext(){
return this.next;
}
public boolean hasNext() {
return this.next != null;
}
public T getPayload() {
return this.payload;
}
public void setNext(Node<T> n) {
this.next = n;
}
public void setPayload(T o) {
this.payload = o;
}
}
это нет утечка памяти. узнайте, что означает утечка памяти. это просто потому, что jvm держит вашу память внутри процесса. это не означает, что ваша память потеряна. – HuStmpHrrr
также, в перспективе gc. нет никакого правила для любой реализации gc для сбора мусора, как только они будут созданы. – HuStmpHrrr
Я знаю, что память не освобождается от процесса java, когда ссылка удаляется, но не должна продолжать потреблять память. Если он не возвращает ОЗУ ОС, не должен ли он, по крайней мере, не получить больше памяти после его перезагрузки. –