java.lang.OutOfMemoryError : Java heap space
Spielte ich mit einigen Beispielen von Sammlungen von Oracle-website
public class Timing {
public static void method(){
List numbers = new ArrayList();
for (double i = 1; i <= Double.MAX_VALUE; i++)
numbers.add(new Double(i));
Collections.shuffle(numbers);
List winningcombination = numbers.subList(0, 10);
Collections.sort(winningcombination);
}
public static void main(String[] args)
{
long start = System.currentTimeMillis();
method();
long end = System.currentTimeMillis();
System.out.println("time elapsed : " + (end-start));
}
}
Habe ich versucht, um zu sehen, wie lange es dauern wird, es zu tun für das Doppelte.MAX_VALUE. Und ich habe diese :
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.ensureCapacity(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
Ich da eine Möglichkeit dieses Problem zu beheben ?
Die eigentliche exception passiert, wenn die ArrayList wählt, um zu wachsen (und eine Kopie der alten Inhalte auf die neue backing-array)
InformationsquelleAutor Wassim AZIRAR | 2011-08-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Möglichkeit, Sie zu erstellen und zu speichern
Double.MAX_VALUE
Objekte in einerCollection
? Nein. Es ist nicht so, dass viel RAM auf der Erde.Double.MAX_VALUE
ist etwa 2-mal zehn, um die 308th macht: das ist 2, gefolgt von über 300 Nullen. Geben Best Buy einen Anruf, sehen Sie, wie viel Sie würde Anklage zu stellen, dass in Ihrem computer.Die Lösung ist nicht, um das Unmögliche versuchen.
Es gibt keine Lösung. Sie kann speichern so viel!
Die Lösung ist die Verwendung einer viel kleineren oberen Grenze für den loop -- nicht mehr als, sagen wir, eine million oder so.
Schreiben Sie ein besserer Algorithmus, speichern nur die bereits ausgewählten zahlen und zufällig wieder, wenn Sie haben das gleiche und Sie haben nicht genug.
InformationsquelleAutor Ernest Friedman-Hill
Selbst wenn Sie genug Speicher,
ArrayList
kann höchstensInteger.MAX_VALUE
Elemente.Double.MAX_VALUE
weit übertrifft, sagte limit.In diesem Fall, Sie lief aus dem Speicher während einer
add
führte, dass der array-Liste zu wachsen.InformationsquelleAutor Dilum Ranatunga
Noch ein weiterer Grund, warum dein code nicht funktionieren kann:
double
können nur Ganzzahlen genau bis zu etwa 2^52 - danachi++
keine Wirkung und diefor
Schleife wird nie beendet.Sollten Sie nie verwenden, floating-point-Variablen, die als Schleifenzähler. Verwenden
int
oderlong
statt.2^52
mal... 😉Naja, werde es ihm leicht unerwartete Ergebnisse, mindestens. Und weil er eigentlich tests
i <= Double.MAX_VALUE
, er werde überlaufeni
unabhängig davon,...NÖ. Irgendwann, i == i+1
#zuckt zusammen# ich wusste nicht, dass die Ungenauigkeit bekam das schlecht, auch im oberen Bereich... ach, grr, hätte es zu erhöhen in einer (positiven nicht-null) Strom von zehn nach, dass, wäre es nicht...
macht der zwei, eigentlich. Und es ist nicht so, dass die Ungenauigkeit kommt noch schlimmer - es ist immer das gleiche, im Verhältnis zu der Größe der Zahl, die repräsentiert werden. Einmal bist du bis zu 2^52, eine Erhöhung von 1 ist (zu Recht) davon ausgegangen, nicht zu viel. OTOH, das format kann unterscheiden zwischen 0.00000000000001 und 0.00000000000002 - Beliebiger Versuch dar, uncountably unendliche Menge in erfordert einige Kompromisse, und es ist wirklich ganz wunderbar, wie es getan werden kann, in nur 64 bit und funktioniert gut, die meiste Zeit.
InformationsquelleAutor Michael Borgwardt
Anstatt das zu tun, was Sie gerade tun, Sie sollte nur erhalten 10 zufällige verdoppelt, fügen Sie Sie zur ArrayList und Sortieren. Das ist im Grunde das, was ist Ihre Methode zu tun.
Erhalten eine zufällige Doppelzimmer, Blick auf
Random.nextDouble()
.InformationsquelleAutor Marcelo
Sie versuchen, zu reservieren in der Größenordnung von 10^308-Werte. Das ist eine Menge von Werten.
10^308
sieht nur so klein ;p100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. Yup, sieht immer noch klein...
Schön gemacht 😉
InformationsquelleAutor djna
Erhöhung der Größe des Heaps zu tun. Nur das Programm ausführen, mit diesem argument:
Wird die heap-Größe von 512 MB. Sie können angeben, wie viel Sie wollen: 1g, 2g und so weiter.
-XmxIMPOSSIBLENUMBER
in diesem Fall...InformationsquelleAutor Caius Brindescu
OutOfMemory
Ausnahme? (Ein PC immer noch nicht nahe gekommen.)Das ist besser, obwohl Sie wahrscheinlich noch nicht so viel Speicher. Das sind etwa 2 Milliarden Objekte, die mindestens 12 bytes plus die Arrays in der array-Liste; also 24GB für die Objekte und eine weitere 8B für das array.
nun, es ist nicht völlig unmöglich, dass ein Verbraucher-grade-PC zu haben, 24GB RAM, in der Tat, in 5 Jahren wird es wahrscheinlich normal sein.
In der Tat, das ist, warum ich sagte: "Sie sind wohl noch nicht so viel". Ich habe einen server, aber keiner von meinen desktops tun!
InformationsquelleAutor Arthur Neves
Im Sie Schleife:
Einer
ArrayList
wird, fügen Sie einfach den Wert derArrayList
wenn es gibt Zimmer. Wenn nicht, wird es erhöhen Sie die Größe derArrayList
und dann weiter hinzufügen.Also, was sind Sie im Grunde tun, ist mit allen reservierten Speicher in Ihrem Haufen, wenn Sie diese
ArrayList
. Wenn Sie IhreArrayList
kleiner Sie sollten in der Lage sein, um es zu halten in Erinnerung.InformationsquelleAutor J Lundberg