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.
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>
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.
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));
}
}
intArray size(byte) -> 56
intList size(byte) -> 240
Ich habe die Größe der Instanz.
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.
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));
}
}
myInstance size(byte) -> 320
Die Größe ist die Summe aus der Größe der vorherigen Instanz plus dem Overhead der Klasse.
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