Ich hatte einen langen Artikel gelesen und finde ihn nicht. Es wurde das folgende Verhalten erläutert, bei dem ein Objekt im Bereich möglicherweise noch nicht gelöscht wurde. In jedem Fall können Sie bitte auf erklären, warum unten endet der in OutOfMemoryError
GC löscht keine Objekte im Bereich
public static void main(String[] args) {
List<A> collect = null;
int i=0;
while(true){
System.out.println(i++);
collect = IntStream.range(0, 10_00_000).mapToObj(x -> new A(x + "")).collect(Collectors.toList());
}
}
class A{
String temp;
A(String a){
this.temp = a;
}
}
Wenn ich einen finalize
in A
mit einer print-Anweisung setzen, wird es nie gedruckt. Und die Instanz endet mit OOME
nach wenigen Iterationen. Warum wird gc
nicht vorher erstellt collect
gelöscht. Und die Anzahl der Iterationen auch nicht konstant ist, es reicht von 3
sogar 100
aber letztlich nicht für -Xmx500m
Zweitens für Spaß, lief ich das obige Programm mit JIT deaktiviert -Djava.compiler=NONE
. Und es läuft für immer wie erwartet. Wie beeinflusst JIT es?
PS: Wenn In eine.innerhalb meiner while-Klausel enthalten ist, wird es wie erwartet ausgeführt.
versuchen Sie, den Puffer nach Ihrer System.out zu leeren. –
@MarshallTigerus Das sollte keine Auswirkungen haben. By the way, es flutet von defaul; t – Jatin
Es scheint das wichtigste Problem ist, dass Sie bei jeder Iteration erstellen Sie eine neue 1m Elems-Liste, und die alte Liste zu deaktivieren. Vielleicht würde man stattdessen 'collect.clear()' und dann 'collect.addAll()' aufrufen, um die – everton