背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下:
# Set larger code cache with -XX:ReservedCodeCacheSize= # This output file may be truncated or incomplete. # # Out of Memory Error (os_linux.cpp:2673), pid=28610, tid=139813184919296
日志分析原因很简单,服务器的内存不够用,导致进程崩溃
JAVA涉及到内存不够用分两种情况:
1, 当超出JVM的分配的内存时,JAVA进程并不会退出只是结束当前的线程
2, 当服务器内存不够时,linux杀死使用内存的一个进程
很简单,但很容易忽略,因为在启动JAVA进程时,服务器检查的是当前内存,并不是可用额度。如,服务器有1G内存,而启动了两个1G内存的JAVA服务是不会报错的,但当内存紧张时,linux会kill任意JAVA服务,造成影响
我用代码重现模拟下这种情况
准备如下
服务器1台,1G内存
模拟JAVA进程,以每秒递增10m内存分配的去榨干服务器
服务器内存总量

发现整个可用内存大小在 3G附近(小于)
加入一个J

本文分析了服务器上JAVA服务因内存不足导致的崩溃日志,指出内存不够用时,JAVA进程可能结束当前线程而非直接退出。通过代码模拟了两种情况:1)JVM内存耗尽,线程停止但进程存活;2)服务器整体内存不足时,Linux会杀死其中一个JAVA进程。建议在多JAVA服务部署时注意预留足够的可用内存。
最低0.47元/天 解锁文章

211

被折叠的 条评论
为什么被折叠?



