记一次新版本部署后的宕机

sorra 发表于 04/08 22:19 修改于 04/09 14:35 阅读数225

今晚部署新版本之后,我快速打开了所有页面以触发模板引擎的编译,这样一来当用户打开页面时就会很快了。

然而就宕机了。

JVM在崩溃前自动留下了一个hs_err_pid26602.log文件,看看它写了什么!

There is insufficient memory for the Java Runtime Environment to continue.
……
Out of Memory Error ……

以上这一段说明了错误原因:内存不足。

def new generation   total 217088K, used 14684K
eden space 193024K,   7% used
from space 24064K,   0% used
to   space 24064K,   0% used

tenured generation   total 504832K, used 504818K …… 99% used

以上这一段描述了内存使用情况,new generation是新生代,tenured generation是老年代。老年代的500MB耗尽了。

最近10次Full GC时老年代的使用率:

 70% (2次) -> 75% (4次) -> 84% (2次) ->  95% (2次) -> 99% (crash)

最近10次事件是模板引擎在编译。

平时也就占用三四百MB的内存, jmap看到的只有二百多MB,怎么老年代会突然暴增到500MB呢?

最大的可能性是内存泄漏!JVM崩溃前的最近10次事件都是模板引擎在编译,最可疑!

可惜这个崩溃现象无法重现,现在我启用了崩溃时自动保存内存快照,下次再遇到就可以知道哪些对象吃了内存。