2016-03-22 9 views
3

Wenn ich die maximale Java-Heap-Größe -Xmx512m, wann was ist die maximale Größe für ein einzelnes Objekt?Java größte Objektgröße in Heap

Angenommen, meine Anwendung hat nur eine einzige Klasse und ich erstelle genau ein einzelnes Objekt.

Gibt es eine ungefähre Größenbeschränkung für dieses Objekt?

Meine Klasse sieht etwas wie unten:

public class BigSingleObj { 
    //conf will contain thousand of String. 
    private Map<String, String> conf = new HashMap<String, String>(); 
    public String getConf(String key) { 
     return conf.get(key); 
    } 
} 

HINWEIS

Als ich meine JVM-Heap-Größe erwähnt, ich anfordernden quantitativ etwas zu beantworten.

+3

Überprüfen Sie diesen Link: [hier Beschreibung eingeben] (http://stackoverflow.com/questions/3618122/does-an-object-in-java-have-any-memory-size-constraints) – sandip

Antwort

3

Das theoretische Objekt größte Java können Sie erstellen (wenn Sie einen ausreichend großen Haufen haben) wird ein long[] mit 2 sein. Das ist 16 GB.

Das größte Objekt, das Sie für eine bestimmte Heap-Größe erstellen können, ist jedoch plattformabhängig. Der Heap der JVM ist in zwei oder mehr "Räume" unterteilt, und jedes gegebene Objekt muss in einen einzigen Raum passen. Ein Objekt, das die Größe des gesamten Heaps erreicht, ist unmöglich.

Die Standardgröße der Leerzeichen wird vom Speichermanager berechnet, und ich bin nie auf eine einfache Formel gestoßen, die vorhersagt, wie groß die Größen sein werden.

Wenn Sie wirklich eine quantitative Schätzung möchten, dann ist es am besten, wenn Sie es experimentell messen. Schreiben Sie ein einfaches Programm, das nacheinander größere Arrays zuordnet, bis Sie ein OOME erhalten. Beachten Sie jedoch, dass die Antwort, die Sie erhalten, von Ihrer VM-Version und den von Ihnen verwendeten JVM-Befehlszeilenoptionen abhängt.


Angenommen, hat meine Anwendung nur eine einzige Klasse, und ich bin zu schaffen genau ein einzelnes Objekt.

Ihre Klasse BigSingleObj weist tatsächlich kein großes Objekt zu. Die HashMap beginnt klein und wächst automatisch, wenn Einträge hinzugefügt werden. Das Objekt HashMap besteht tatsächlich aus einer Anzahl von Objekten. Die größte davon wird das Hash-Array sein, aber die Gesamtgröße des HashMap wird das 5-fache oder mehr der Größe dieses Arrays betragen. Und dann müssen Sie den von den Schlüsseln und Werten belegten Platz hinzufügen ... was in Ihrem Fall von den String-Größen abhängt.

All dies bedeutet, dass die Größe des größten zuweisbaren Objekts kein nützlicher Prädiktor dafür ist, wie viele Einträge Sie in Ihrem großen HashMap speichern können.

+0

Alle Quellen zu Argument deine Antwort? – adranale

+0

Abs. 1: die JLS und JVMS. Abs. 2: Verschiedene Oracle-Dokumente zur Java-Speicherbereinigung. Para 4: das Javadoc für HashMap (und den Quellcode). Abs. 5: Der Quellcode + Hintergrundwissen über typische JVM-Objektdarstellungen. –

2

Es hängt davon ab, JRE, die Sie verwenden. Ob du x64 benutzen willst - mehr Platz, den dein Objekt braucht. Sie können JOL (Java Object Layout) verwenden, um zu berechnen, wie groß Ihr Objekt sein wird.

Dies kann Ihnen eine Idee geben, wie viel Platz es braucht.