Messen des Instanznutzungsspeichers in Java

Untersuchung der für jede Instanz verwendeten Speichergröße

Im vorherigen Artikel (https://qiita.com/N_G/items/2dab8694fdebce2de868) habe ich beschrieben, wie der Speicherauslastungsstatus in einer Java-Anwendung überprüft wird. Nachdem ich den Prozess verstanden habe, der Speicher verwendet, möchte ich dieses Mal messen, wie viel Speicher jede Instanz tatsächlich verwendet.

Einführung der Java-Größe der Bibliothek

Es gibt mehrere Bibliotheken, die die Java-Größe messen, aber dieses Mal verwenden wir die Bibliothek ** java-sizeof **. Eine von [CARROT SEARCH LAB] entwickelte Bibliothek (https://labs.carrotsearch.com/hppc.html)

--Veröffentlicht im Maven Repository.

Es gibt Vorteile wie. Laden Sie die JAR-Datei von [Maven epository] herunter (https://mvnrepository.com/artifact/com.carrotsearch/java-sizeof). Wenn Sie Maven verwenden, fügen Sie Folgendes in Ihre pom.xml-Datei ein: Geben Sie für die Version die Version an, die Sie installieren möchten. Dieser Artikel verwendet "0.0.5".

<dependency>
    <groupId>com.carrotsearch</groupId>
    <artifactId>java-sizeof</artifactId>
    <version>{version}</version>
</dependency>

Wie benutzt man

Jetzt möchte ich die Größe des Speichers mit der Java-Größe der Bibliothek messen. Rufen Sie einfach die Funktion * RamUsageEstimator.sizeOf * für die Instanz auf, die Sie wie folgt messen möchten.

Beispielcode

import com.carrotsearch.sizeof.RamUsageEstimator;
import java.util.ArrayList;
import java.util.List;

public class JavaSizeofTest
{
    public static void main( String[] args )
    {
    	int[] intArray = new int[10];
    	List<Integer> intList = new ArrayList<Integer>(10);

    	for(int i = 0 ; i < 10 ; i++){
    		intArray[i] = i;
    		intList.add(i);
    	}

    	System.out.println("intArray size(byte) -> " + RamUsageEstimator.sizeOf(intArray));
        System.out.println("intList size(byte) -> " + RamUsageEstimator.sizeOf(intList));
    }
}

Ausgabe

intArray size(byte) -> 56
intList size(byte) -> 240

Ich habe die Größe der Instanz.

Speichermessung für Instanzen Ihrer eigenen Klasse

Mit der obigen Methode können Sie auch den Speicher Ihrer eigenen Klasseninstanz messen. Sie können die Größe der Summe der Größen aller Elementvariablen rekursiv ermitteln.

Beispielcode

package so_netmedia.java_sizeof_test;

import com.carrotsearch.sizeof.RamUsageEstimator;
import java.util.ArrayList;
import java.util.List;

public class JavaSizeofTest2
{
    static class MyClass{
        int[] intArray = new int[10];
        List<Integer> intList = new ArrayList<Integer>(10);

        public MyClass(){
            for(int i = 0 ; i < 10 ; i++){
                intArray[i] = i;
                intList.add(i);
            }
        }
    }

    public static void main( String[] args )
    {
    	MyClass myInstance = new MyClass();
    	System.out.println("myInstance size(byte) -> " + RamUsageEstimator.sizeOf(myInstance));
    }
}

Ausgabe

myInstance size(byte) -> 320

Die Größe ist die Summe aus der Größe der vorherigen Instanz plus dem Overhead der Klasse.

Dimensionierung in der Anwendung

Durch Ausführen der obigen Speichermessung an einer Instanz, die groß zu sein scheint, und Ausgeben eines Protokolls ist es möglich zu untersuchen, wie viel Speicher in welcher Instanz verwendet wird. Finden Sie heraus, welche Instanzen Speicher verbrauchen, und reduzieren Sie den Speicher. Eine letzte Sache, die zu beachten ist, ist, dass es einige Zeit dauert, den Speicher von ** großen Instanzen zu messen. ** Vergessen Sie nicht, die Kontrolle zu übernehmen, z. B. das Messen in der Staging-Umgebung und das Überspringen der Produktion.

Recommended Posts

Messen des Instanznutzungsspeichers in Java
Untersuchen Sie die Speichernutzung von Java-Elementen
Partisierung in Java
[Java-Entwicklung] Java-Speicher
Änderungen in Java 11
[Java] Ausnahmeinstanz
Janken in Java
Umfangsrate in Java
FizzBuzz in Java
Notizen im Kopf organisieren (Java - Instance Edition)
Java Nr. 3 für die Stream-Speichernutzung, die für Unternehmen nützlich ist
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Kommentare in der Java-Quelle
Azure funktioniert in Java
Formatieren Sie XML in Java
Verwendung von Java-Variablen
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Erstellen Sie JSON in Java
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Verwenden Sie PreparedStatement in Java
Was ist neu in Java 9,10,11
Parallele Ausführung in Java
[AWS] Verknüpfen Sie die Speichernutzung der Ubuntu EC2-Instanz mit CloudWatch
Versuchen Sie es mit RocksDB mit Java
Über Java-Instanzen
Lesen Sie Binärdateien in Java 1
[Java] Mirage-Basic-Verwendung von SQL
Vermeiden Sie den Fehler, den Yuma in Java gemacht hat
Holen Sie sich EXIF-Informationen in Java
[Neta] Sleep Sort in Java
Bearbeiten von ini in Java: ini4j
Java-Geschichte in dieser Welt
Segfo Java in 6 Zeilen
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Probieren Sie den Funktionstyp in Java aus! ①
Ich habe ein Roulette in Java gemacht.