OOMを発生させる方法

OOMを疑似的に発生させヒープダンプが正しく出されるか検証
コードはすべてここに置いています。

github.com

  1. Spring bootのwebプロジェクトを作成
  2. OOMのタイミングをコントロールするために適当なコントローラーを作成
    こんな感じ
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method= RequestMethod.GET)
    public String hello() {
        return "Hello Spring MVC";
    }
}

次のメソッドを追加

    @RequestMapping(value="/test", method=RequestMethod.GET)
    public void test() {
        Object[] o = null; while (true) { o = new Object[] {o}; }
    }

補足 OutOfMemoryErrorをthrowするのではヒープダンプは出さない

    @RequestMapping(value="/test", method=RequestMethod.GET)
    public void test() {
        throw new OutOfMemoryError();
    }
  1. アプリケーション起動時にXmxを小さくする
    java -Xmx50m -XX:+CrashOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dump/oom.bin -jar target/demo-0.0.1-SNAPSHOT.jar
    ** 制限しない場合はPCのメモリを使い果たすまでメモリを消費するので注意

`