メモリ使用量を見積もる最も簡単な方法は、Runtime
クラスのメソッドを使用することです。
これに頼らないことをお勧めしますが、おおよその見積もりにのみ使用してください。理想的には、この情報をログに記録して独自に分析し、テストやコードの自動化には使用しないでください。
あまり信頼できないかもしれませんが、単体テストのような閉じた環境では、現実に近い見積もりが得られるかもしれません。
特に、System.gc()
ガベージ コレクターを呼び出した後、期待どおりに実行されるという保証はありません (これは GC の提案にすぎません)。そこにfreeMemory
記載されているメソッドには精度の制限があります。さらに注意事項があるかもしれません。
解決:
private static final long BYTE_TO_MB_CONVERSION_VALUE = 1024 * 1024;
@Test
public void memoryUsageTest() {
long memoryUsageBeforeLoadingData = getCurrentlyUsedMemory();
log.debug("Used memory before loading some data: " + memoryUsageBeforeLoadingData + " MB");
List<SomeObject> somethingBigLoadedFromDatabase = loadSomethingBigFromDatabase();
long memoryUsageAfterLoadingData = getCurrentlyUsedMemory();
log.debug("Used memory after loading some data: " + memoryUsageAfterLoadingData + " MB");
log.debug("Difference: " + (memoryUsageAfterLoadingData - memoryUsageBeforeLoadingData) + " MB");
someOperations(somethingBigLoadedFromDatabase);
}
private long getCurrentlyUsedMemory() {
System.gc();
return (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / BYTE_TO_MB_CONVERSION_VALUE;
}