インスタンス毎の使用メモリサイズの調査
前回の記事でJavaアプリケーションにおける、メモリの使用状況を確認する方法を記載しました。今回は、メモリを使用する処理が分かった後、それぞれのインスタンスが実際にメモリをどの程度使っているかの計測をしたいと思います。
java-sizeofライブラリの導入
Javaのサイズを計測するライブラリはいくつかありますが、今回は java-sizeof ライブラリを使用します。CARROT SEARCH LABが開発しているライブラリで
- Maven Repositoryに公開されている。
- Java6,7,8をサポートしている。
等の利点があります。
jarファイルはMaven epository からダウンロードしてください。Mavenを使用する場合は、pom.xmlファイルに以下を記載します。versionはインストールしたいversionを指定してください。本記事では"0.0.5"を使用しています。
<dependency>
<groupId>com.carrotsearch</groupId>
<artifactId>java-sizeof</artifactId>
<version>{version}</version>
</dependency>
使い方
それではjava-sizeofライブラリを使用してメモリのサイズ計測を行いたいと思います。
以下のように計測したいインスタンスに対し、RamUsageEstimator.sizeOf 関数を呼び出すだけです。
サンプルコード
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
インスタンスのサイズが取得できました。
独自クラスのインスタンスのメモリ計測
上の方法を使用すると自作クラスのインスタンスのメモリの計測も可能です。再帰的に全てのメンバ変数のサイズを足し合わせたサイズを知ることができます。
サンプルコード
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
先ほどのインスタンスのサイズの合計に、クラスのオーバーヘッドを足したサイズとなりました。
アプリケーションでのサイズ計測
上のメモリ計測をサイズが大きそうなインスタンスで行い、ログ出力することで、どのインスタンスでどのくらいのメモリが使用されているかを調査することができます。メモリを消費しているインスタンスを突き止めてメモリの削減を行いましょう。 最後に一点注意ですが、サイズの大きなインスタンスのメモリ計測にはある程度の時間がかかります。 Staging環境では測定して、本番ではskipする等、制御を忘れないようにしましょう。