OOMを発生させる方法
OOMを疑似的に発生させヒープダンプが正しく出されるか検証
コードはすべてここに置いています。
- Spring bootのwebプロジェクトを作成
- 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(); }
- アプリケーション起動時にXmxを小さくする
java -Xmx50m -XX:+CrashOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dump/oom.bin -jar target/demo-0.0.1-SNAPSHOT.jar
** 制限しない場合はPCのメモリを使い果たすまでメモリを消費するので注意
`