メモリオーバーフローの状況をシミュレートする
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* 向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程 序能够正常执行,最后打印ok。
*/
public class TestJvmOutOfMemory {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
String str = "";
for (int j = 0; j < 1000; j++) {
str += UUID.randomUUID().toString();
}
list.add(str);
}
System.out.println("ok");
}
}
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
MATによる分析
分析結果から、メモリの92.16%がObject []で占められていることがわかり、疑わしいです。
MATインターフェースの主な機能の概要
リアルタイムでヒープダンプを生成する
ヒストグラム
棒グラフは、クラスの数、占有スペースなど、各クラスの使用状況を示します。
グループ化
選別
定期的な検索
引用を表示
コード
import java.util.ArrayList;
import java.util.Random;
/**
* -Xms30m -Xmx30m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dump.hprof
*/
public class OOMTest {
public static void main(String[] args) throws InterruptedException {
ArrayList<Box> list = new ArrayList<>();
while(true){
Thread.sleep(100);
list.add(new Box(new Random().nextInt(1024 * 1024)));
}
}
}
class Box{
private byte[] data;
public Box(int length) {
this.data = new byte[length];
}
}
2つのヒストグラムの比較
インおよびアウトリファレンス
支配ツリー
スレッド情報を表示する
ヒープ全体の情報を表示する
最も消費するオブジェクトなど、全体的なヒープ情報を表示します。