oom 和 jvm crash的问题
很多次生产环境jvm进程无故消失的时候都留下了hs_err[pid].log文件 然后通过mat分析大多数情况是oom导致的 所以以前一直认为OOM一定会导致jvm crash 也就是说java进程直接退出
最近想了解下hs_err的错误日志,然后就自己写了段oom的代码,如下:
Map<Integer, Builder> testMap = new HashMap<Integer, Builder>(); while(true){ //a builder object has 50M bytes testMap.put(i, new Builder()); i++; }
设置jvm参数 -Xms 256M -Xmx 256M,运行之后确实出现了OOM 但是到处找hs_err的log文件 怎么也找不到 于是怀疑jvm参数配置有问题。了解后发现关于hs_err的参数,只需要通过-XX:ErrorFile来自定义路径即可,如果没有该配置也不会影响日志的生成,所以没生成日志不是jvm配置的问题,也就是说,jvm没有直接crash。
给上段代码套上try catch 来捕获OutOfMemoryError 发现只是抛出了一个异常,下边的代码还是可以跑的。所以,此次OOM并没有导致jvm crash 而是抛出了oom之后没有catch,jvm退出了,所以没有留下hs_err日志