WebSphere eXtreme Scale unterstützt
die Messung der Speicherbelegung von BackingMap-Instanzen in verteilten Datengrids.
Für lokale Datengridinstanzen wird die Messung der Speicherbelegung nicht unterstützt.
Der Wert, der von WebSphere eXtreme Scale für eine bestimmte Map gemeldet wird,
liegt sehr nahe an dem Wert, der von der Heapspeicherauszugsanalyse gemeldet wird. Wenn das Map-Objekt komplex ist,
können die Größenmessungen weniger genau sein.
Im Protokoll wird die Nachricht
CWOBJ4543 für jedes Cacheeintragsobjekt angezeigt, das nicht genau gemessen werden kann, weil es zu komplex ist.
Sie können eine genauere Messung erreichen, indem Sie eine unnötige Map-Komplexität vermeiden.
Vorgehensweise
- Aktivieren Sie den Agenten für die Messung.
Wenn Sie eine JVM (Java Virtual Machine) der Java Version 5 oder verwenden, verwenden Sie den Agenten für die Größenmessung.
Mit diesem Agenten kann
WebSphere eXtreme Scale
zusätzliche Informationen von der JVM abrufen, um seine Schätzungen zu verbessern.
Der Agent kann durch Hinzufügen des folgenden Arguments zur JVM-Befehlszeile geladen werden:
-javaagent:WXS-Bibliotheksverzeichnis/wxssizeagent.jar
Für eine integrierte Topologie fügen Sie das Argument der Befehlszeile für den Prozess von
WebSphere Application
Server hinzu.
Für eine verteilte Topologie fügen Sie das Argument der Befehlszeile der Prozesse von
eXtreme Scale (Container) und des Prozesses von
WebSphere Application
Server hinzu.
Wenn der Agent ordnungsgemäß geladen wird, erscheint die folgende Nachricht in der Datei
SystemOut.log.
CWOBJ4541I: Die erweiterte Speichergrößenanpassung für die BackingMap ist aktiviert.
- Verwenden Sie vorzugsweise und sofern möglich Java-Datentypen anstelle angepasster Datentypen.
WebSphere eXtreme Scale kann die Speicherkosten der folgenden
Typen genau messen:
- java.lang.String und Arrays, wenn String die Komponentenklasse ist
(String[])
- alle primitiven Wrapper-Typen (Byte, Short, Character, Boolean,
Long, Double, Float, Integer) und Arrays, wenn primitive Wrapper
der Komponententyp sind (z. B. Integer[], Character[])
- java.math.BigDecimal and java.math.BigInteger und Arrays, wenn diese beiden Klassen
der Komponententyp sind (BigInteger[] und BigDecimal[])
- Zeittypen (java.util.Date, java.sql.Date, java.util.Time,
java.sql.Timestamp)
- java.util.Calendar und java.util.GregorianCalendar
- Vermeiden Sie, sofern möglich, Objektinternalisierung.
Wenn ein Objekt in eine Map eingefügt wird, geht
WebSphere eXtreme Scale davon aus,
dass diese Map die einzige Referenz auf das Objekt und alle Objekte, auf die das Objekt direkt verweist, enthält.
Wenn Sie 1000 angepasste Objekte in eine Map einfügen und jedes eine Referenz auf dieselbe
Zeichenfolgeinstanz enthält, misst
WebSphere eXtreme Scale diese Zeichenfolgeinstanz
1000 Mal und überschätzt damit die tatsächliche Größe der Map im Heapspeicher.
WebSphere eXtreme Scale kompensiert dies in den folgenden gängigen Internalisierungsszenarien
ordnungsgemäß:
- Referenzen auf Java-5-Aufzählungen (enums)
- Referenzen auf Klassen, die dem typsicheren enum-Muster folgen.
Klassen, die diesem Muster entsprechen, haben nur private Konstruktoren, mindestens ein
privates Feld "static final" des eigenen Typs und, wenn sie "Serializable" implementieren, implementiert die Klasse die Methode
readResolve().
- Internalisierung von Java-5-Primitive-Wrappern,
z. B. Verwendung von Integer.valueOf(1) anstelle des neuen Integer(1).
Wenn Sie Internalisierung verwenden müssen, verwenden Sie eine der zuvor beschriebenen Techniken, um genauere Schätzungen zu erhalten.
- Verwenden Sie angepasste Typen mit Bedacht.
Wenn Sie angepasste Typen verwenden, sollten Sie primitive Datentypen Objekttypen für Felder vorziehen.
Ziehen Sie außerdem die unter 2 aufgelisteten Objekttypen eigenen angepassten Implementieren vor.
Beschränken Sie die Objektstruktur bei der Verwendung angepasster Typen auf eine einzige Ebene.
Wenn Sie ein angepasstes Objekt in eine Map einfügen, berechnet
WebSphere eXtreme Scale nur die Kosten für das eingefügte Objekt,
einschließlich aller primitiven Felder und aller direkt im Objekt referenzierten Objekte.
WebSphere eXtreme Scale verfolgt keine Referenzen auf untere Ebenen der Objektstruktur.
Wenn Sie ein Objekt in die Map einfügen und
WebSphere eXtreme Scale Referenzen erkennt, die während des Größenmessungsprozesses
nicht verfolgt wurden, wird die Nachricht CWOBJ4543 ausgegeben, die den Namen der Klasse enthält, die nicht vollständig
gemessen werden konnte.
Wenn dieser Fehler auftritt, behandeln Sie die Größenstatistiken in der Map als Trenddaten und nicht als exakte
Summe.
- Verwenden Sie, sofern möglich, den Kopiermodus CopyMode.COPY_TO_BYTES.
Verwenden Sie den Kopiermodus "CopyMode.COPY_TO_BYTES", um alle Unsicherheiten bei der Messung von
Werteobjekten auszuschließen, die in die Map eingefügt werden, selbst wenn eine Objektstruktur
zu viele Ebenen für eine normale Messung hat (was zur Ausgabe der Nachricht CWOBJ4543 führt).