speicherverbrauch 2dimensionales array - rätsel?!

braindamage

Mitglied
Hi Leute,

Java gibt mir derzeit immer mehr rätsel auf da ich mit grassen mengen an daten
hantiere und sehr auf speicherverbrauch geachtet werden muss...
daher wollte ich mir eine arraylist implementieren...
ich verwende ein 2 dimensionales array mit jeweils 1M Integern in der 2. dimension
=>sollte jeweils 4mb kosten....warum kommt folgender code nicht mit 400Mb und auch nicht
mit 450 mb arbeitsspeicher aus?
wenn mir das einer erklärt wäre ich glücklich ;-)
Code:
package util;

public class ChunkedIntArrayList {
	//the chunks
	private int[][] data;
	//position to put the next element
	private int offsetI, offsetJ;
	//number of elements stored in data array
	private int numElements;
	//number of elements that fit in data array
	private int size;
	//number of integers per chunk
	private final int chunkSize;
	
	public ChunkedIntArrayList(int chunkSize) {
		this.chunkSize = chunkSize;
		data = new int[1][chunkSize];
		offsetI = 0;
		offsetJ = 0;
		numElements = 0;
	}
	
	public void add(int val) {
		if(offsetJ == chunkSize) {
			addChunk();
			offsetI++;
			offsetJ = 0;
		}
		data[offsetI][offsetJ++] = val;
		numElements++;
	}
	
	public int get(int idx) {
		int i = idx / chunkSize;
		int j = idx % chunkSize;
		return data[i][j];
	}
	
	public void set(int idx, int val) {
		int i = idx / chunkSize;
		int j = idx % chunkSize;
		data[i][j] = val;
	}
	
	public int size() {
		return numElements;
	}
	
	private void addChunk(){
		System.out.println("addChunk "+data.length + " " + numElements);
		int[][] tmp = new int[data.length + 1][];
		for(int i=0;i<data.length;i++) {
			tmp[i] = data[i];
		}
		tmp[tmp.length - 1] = new int[chunkSize];
		data = tmp;
		size = chunkSize * data.length;
	}
	
	public static void main(String[] args) throws InterruptedException{
		int size = 100000001;
		ChunkedIntArrayList list = new ChunkedIntArrayList(1000000);
		System.out.println("add");
		for(int i=0;i<size;i++){
			list.add(i);
		}
		System.out.println("add");
		for(int i=0;i<size;i++){
			list.set(i, i+1);
		}
		System.out.println("get");
		for(int i=0;i<list.size;i++){
		//	System.out.println(list.get(i));
		}
		Thread.sleep(10000);
	}
}
 
S

SlaterB

Gast
> int size = 100000001;

= 100 Mio. ~ 400 MB

edit: ok, diese Zahl verwendest du nicht direkt, dann schaue ich noch etwas

edit2:
bei 10 Mio. läuft das Programm bei mir mit Ausgabe:

Code:
add
addChunk 1 1000000
addChunk 2 2000000
addChunk 3 3000000
addChunk 4 4000000
addChunk 5 5000000
addChunk 6 6000000
addChunk 7 7000000
addChunk 8 8000000
addChunk 9 9000000
addChunk 10 10000000
add
get
verständlich, 40 MB passt,

bei 100 Mio. habe ich bei Standard-64 MB
Java:
add
addChunk 1 1000000
addChunk 2 2000000
addChunk 3 3000000
addChunk 4 4000000
addChunk 5 5000000
addChunk 6 6000000
addChunk 7 7000000
addChunk 8 8000000
addChunk 9 9000000
addChunk 10 10000000
addChunk 11 11000000
addChunk 12 12000000
addChunk 13 13000000
addChunk 14 14000000
addChunk 15 15000000
addChunk 16 16000000
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
passt,
bei -Xmx400M läuft es durch, bei -Xmx380M läuft es etwa bis 97 Mio., scheint alles ungefähr zu stimmen
 
Zuletzt bearbeitet von einem Moderator:

braindamage

Mitglied
100000001 soviele ints werden in der for schleife eingefügt...
die chunk size ist 1000 000 sollte dann also auf 101 chunks hinauslaufen und 44mb + wenig overhead genügen....aber mein verständnis scheint ja falsch zu sein....dachte 101 int arrays kosten 101 * 12byte ~ 1kb overhead
 
S

SlaterB

Gast
siehe auch mein Posting zuvor, editiert,

jeder Chunk 4 MB, 100 davon sind 400 MB, 400 MB Speicher reichen bei mir auch,
welche Einstellungen hast du exakt, bis wieweit läuft das Programm?
 

braindamage

Mitglied
hm danke dir für die schnelle antwort...
also bei mir bei -Xmx400M sieht die ausgabe so aus

Code:
addChunk 63 63000000
addChunk 64 64000000
addChunk 65 65000000
addChunk 66 66000000
addChunk 67 67000000
addChunk 68 68000000
addChunk 69 69000000
addChunk 70 70000000
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at util.ChunkedIntArrayList.addChunk(ChunkedIntArrayList.java:55)
	at util.ChunkedIntArrayList.add(ChunkedIntArrayList.java:25)
	at util.ChunkedIntArrayList.main(ChunkedIntArrayList.java:65)


irgendeine idee dazu? verwende ne 64 bit vm, aber sollte eigentlich kein prob sein oder ?
 
S

SlaterB

Gast
direkt keine Idee, außer der naheliegenden, dass bei dir ein int vielleicht 8 Byte belegt, auch wenn die 70 eher eine komische Grenze ist,
hier noch Prüfmöglichkeiten:

Java:
    static Runtime r = Runtime.getRuntime();


 private void addChunk()
    {
        System.out.println("addChunk " + data.length + " " + numElements);
        System.out.println(r.maxMemory() + " - " + r.freeMemory() + " - " + r.totalMemory() 
        + " used: " + (r.totalMemory() - r.freeMemory()));
...

->

Code:
add
addChunk 1 1000000
416219136 - 879896 - 5177344 used: 4297448
addChunk 2 2000000
416219136 - 3738072 - 11911168 used: 8173096
addChunk 3 3000000
416219136 - 2532976 - 14708736 used: 12175760
addChunk 4 4000000
416219136 - 5648008 - 21831680 used: 16183672
addChunk 5 5000000
416219136 - 1647992 - 21831680 used: 20183688
...

addChunk 98 98000000
416219136 - 24062808 - 416219136 used: 392156328
addChunk 99 99000000
416219136 - 20060280 - 416219136 used: 396158856
addChunk 100 100000000
416219136 - 16060264 - 416219136 used: 400158872
add
get
am Ende werden bei mir recht genau 400 Mio. Bytes belegt von 416 Mio.,
jeder neue Chunk benötigt exakt 4 Mio. + Kleingeld
 

braindamage

Mitglied
Guter tipp...sieht dann bei mir so aus....
wieder mit -Xmx400M

verdammt, mir sieht das nach einem bug in der vm aus,
free momory ist ungefähr 5mb aber es sind nur 276mb used
komisch

Code:
addChunk 66 66000000
372834304 - 4812176 - 269156352 used: 264344176
addChunk 67 67000000
addChunk 67 67000000
372834304 - 4875384 - 273219584 used: 268344200
addChunk 68 68000000
addChunk 68 68000000
372834304 - 4938592 - 277282816 used: 272344224
addChunk 69 69000000
addChunk 69 69000000
372834304 - 5001800 - 281346048 used: 276344248
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at util.ChunkedIntArrayList.addChunk(ChunkedIntArrayList.java:60)
	at util.ChunkedIntArrayList.add(ChunkedIntArrayList.java:26)
	at util.ChunkedIntArrayList.main(ChunkedIntArrayList.java:70)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
4 MB pro Chuck kommt also hin,
das Maximum für Java ist bei dir nur 373 Mio., warum auch immer, kann ich nicht sagen, läßt sich mit höherem -Xmx vielleicht noch erhöhen,
bedenklicher ist allerdings, dass davon nur 281 Mio. wirklich genutzt werden, und dann schon die Exception fliegt

oder stehen vielleicht noch weitere addChunck-Einträge hinter der Exception? die Reihenfolge der Ausgaben muss nicht exakt sein

was passiert bei 450, 500, 500 MB?
 

braindamage

Mitglied
Also bei 500M:

Code:
addChunk 86 86000000
466092032 - 6013312 - 350420992 used: 344407680
addChunk 87 87000000
addChunk 87 87000000
466092032 - 4831336 - 353239040 used: 348407704
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at util.ChunkedIntArrayList.addChunk(ChunkedIntArrayList.java:60)
	at util.ChunkedIntArrayList.add(ChunkedIntArrayList.java:26)
	at util.ChunkedIntArrayList.main(ChunkedIntArrayList.java:70)

bei 600M laüfts durch..
Code:
addChunk 98 98000000
addChunk 98 98000000
559284224 - 6771808 - 399179776 used: 392407968
addChunk 99 99000000
addChunk 99 99000000
559284224 - 6835016 - 403243008 used: 396407992
addChunk 100 100000000
addChunk 100 100000000
559284224 - 6898224 - 407306240 used: 400408016
add

aber 1/3 mehr speicher ist mir zuviel...und ärgerlich!
hab mit 2gb eh schon zu wenig hauptspeicher, bräucte 8 oder 10...

noch ne idee? die exception war die einzige und letzte, kam nix mehr danach.
dnank und gruss
 

LoR

Bekanntes Mitglied
Die Antwort ist eigentlich ganz einfach und nicht so rätselhaft wie du denkst :). Das Problem (?) ist, dass du eine 64 Bit VM benutzt und das hat erhebliche Konsequenzen auf den Speichervebrauch. Z.B.

1. Alle Pointer haben eine Größe von 64 Bit.
2. Der Objektheader ist wesentlich größer.
3. Aufgrund des Alignments sind die primitiven Datentypen auf dem Stack im Durchschnitt doppel so groß. (Das dürfte auch den höheren Memoryverbrauch erklären)
usw.

U.a. wird aus diesem Grund auch empfohlen auf 64 Bit Maschinen mehr Memory zu verwenden.

Hoffe ich konnte weiterhelfen :).

Gruß
 

braindamage

Mitglied
hm, interessanter punkt mit den 64bit pro pointer, aber das ist nicht die lösung,
da nur 1 pointer pro 1 million ints benötigt wird, d.h. das fällt überhaupt nicht ins gewicht, oder irre ich mich?
 

Empire Phoenix

Top Contributor
erm soweit ich das sehe sind es eher 1 million pointer auf einen int. Und ums richtig zu sagen Referenzen, java kennt keine Pointer in dem sinne.

Zudem wenn ich mcih nciht falsch erinner, benutzt java bei primitves call by copy/value oder wies hieß
 
S

SlaterB

Gast
es geht doch um int[1000000], wieso sollten das Pointer sein?
ob ein int nun 64 statt 32 Bit belegt ist eine Frage, die Ausgabe von Runtime.getRuntime() spricht aber weiter von 4 MB pro derartigen Block,
da wäre nun höchstens zusätzlich denkbar, dass auch diese Anzeige verbuggt ist, nicht dem letztlich realen Speicherverbrauch entspricht,
kann man das annehmen?

da außerdem 99% des Speichers von einem Typ sind (int[]) würde ich wenigstens doppelten Speicherverbrauch erwarten, falls er überhaupt steigt, nicht ~40% mehr,
aber ohne Wissen bringen solche Spekulationen wenig
 

LoR

Bekanntes Mitglied
hm, interessanter punkt mit den 64bit pro pointer, aber das ist nicht die lösung,
da nur 1 pointer pro 1 million ints benötigt wird, d.h. das fällt überhaupt nicht ins gewicht, oder irre ich mich?

Lies mal meine Antwort etwas genauer! Mit der Pointergröße hat das tatsächlich nix zu tun, aber mit dem Alignment der primitiven Datentypen (s. Punkt 3). Ein Fehler in der JVM ist das jedenfalls nicht.

Darüber hinaus ist es in Java sowieso immer etwas schwierig den tatsächlichen Speicherverbrauch vorherzusagen. Die JVM stellt sich z.T. als "Black-Box" dar.

da außerdem 99% des Speichers von einem Typ sind (int[]) würde ich wenigstens doppelten Speicherverbrauch erwarten, falls er überhaupt steigt, nicht ~40% mehr

Nein. 40% Prozent kommt sogar sehr gut hin.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Datentypen interner Speicherverbrauch x64 long vs. int Allgemeine Java-Themen 8
B Speicherverbrauch Objekt-Referenz Allgemeine Java-Themen 11
M Analysieren von Speicherverbrauch Allgemeine Java-Themen 5
lacco Speicherverbrauch von Arrays Allgemeine Java-Themen 2
O Speicherverbrauch von Java / VM sehr hoch? Allgemeine Java-Themen 27
G Speicherverbrauch einer Variable Allgemeine Java-Themen 2
G Speicherverbrauch eines Programms Allgemeine Java-Themen 2
L Speicherverbrauch einer Anwendung unter Windows Allgemeine Java-Themen 2
J Speicherverbrauch des Systems ermitteln Allgemeine Java-Themen 4
J Maximalen Speicherverbrauch ermöglichen Allgemeine Java-Themen 2
C Speicherverbrauch von JDialog enorm Allgemeine Java-Themen 6
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
M Array Rang eines Elements Allgemeine Java-Themen 4
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
noah1407 Array Allgemeine Java-Themen 3
D Methoden Teil-Array mit Maximalwert bestimmen Allgemeine Java-Themen 23
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
N zweidimensionalen Array in dreidimensionalen Array speichern Allgemeine Java-Themen 4
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
L Array und Index Allgemeine Java-Themen 26
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
Willi.We Array sortieren Allgemeine Java-Themen 5
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
H Array Sportschütze Allgemeine Java-Themen 6
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
M Array verändern Allgemeine Java-Themen 1
A JavaFX 2 dimensionales array Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
parrot Array Aufgabe Allgemeine Java-Themen 3
N String Array Eingabe Allgemeine Java-Themen 6
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
A Array Problem Allgemeine Java-Themen 8
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
F Datei in String-Array einlesen Allgemeine Java-Themen 8
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
F 3 Dimensionales Array mit Allgemeine Java-Themen 9
M Steueralgorithmus verwandelt Array in Anfangszustand Allgemeine Java-Themen 9
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
T Objekt in Array packen Allgemeine Java-Themen 6
M Zahlen in Array anordnen Allgemeine Java-Themen 8
M Eclipse Unvollständigen Array ansteuern Allgemeine Java-Themen 2
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Variablen Array ertellen bei model.put Allgemeine Java-Themen 13
S Eindimensionales Array in zweidimensionales Array speichern Allgemeine Java-Themen 5
R convert 2d array list to 2d array Allgemeine Java-Themen 1
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
L Datentypen 3D Array Allgemeine Java-Themen 3
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
E Swing Array mit Bildern in GUI darstellen Allgemeine Java-Themen 2
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
M Zweidimensionales Array mit Binärzahlen füllen Allgemeine Java-Themen 8
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
G Array ohne Aufzählungszeichen ausgeben Allgemeine Java-Themen 6
J Wie kann ich ein Java Array als Säulendiagramm ausgeben? Allgemeine Java-Themen 2
Z 2D Array Pixels reparieren Allgemeine Java-Themen 2
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
B Polibios Array erweitern Allgemeine Java-Themen 1
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
J Array-List Bubble-Sort Allgemeine Java-Themen 12
4 Variablen Int-Array Int Zuweisen Allgemeine Java-Themen 7
J Array Allgemeine Java-Themen 8
Z Array mit unterschiedlichen Werten Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben