2015-01-09 95 views
3

我正在Redhat Unix机器上检查我的Java服务,但只发现该机器的SSH没有工作,SA解释说机器内存耗尽并开始占用交换空间,最终导致机器挂起并关机。可以通过一个java服务关闭主机的Unix框?

他暗示说我的java服务会关闭服务器,我很难相信这可能是怎么可能的 - 正如我认为在最坏的情况下,服务会抛出OutOfMemory异常并且只会自行崩溃。

我的Java内存设置为:“-Xms1g -Xmx5g”,并从/ proc/meminfo中则显示框有

MemTotal:  16304084 kB 
MemFree:  12288796 kB 

第二个问题是,我们可以看看一些日志在/ var /登录以查明真正的问题是什么?

+0

@Greycon“即使JVM内存不足,它也不会消耗所有主机操作系统内存” - 错误,这仍然是可能性;在一台64位机器上,例如,即使机器只有4个,您也可以指定最大堆大小为5G。JVM不关心,并且分配失败将由操作系统处理 – fge

+0

有一件事需要考虑:设置-Xms1g -Xmx5g到-Xms5g -Xmx5g或其他适当的。这有助于通过在启动时分配所有内存来防止堆碎片。更多这里:http://stackoverflow.com/questions/1253388/how-to-analyze-memory-fragmentation-in-java –

回答

2

您可以查看日志存档以查看内存不足杀手是否在内存不足时杀死了您的或其他进程(我的日志恰好位于/var/log/all.log中,您的可能是其他地方和/或你应该看看日志发生这种情况的一天 - 编辑,在RedHat,这应该是/var/log/messages,但我不知道他们是如何在默认情况下旋转):

# grep -i -e "Killed process" -e "out of memory" /var/log/all.log 
1406786406 1406786406 0 3 127.0.0.1 2014-07-31T01:00:06-05:00 ahostname kern err kernel[76729.082621]: [76729.082621] 
    Out of memory: Kill process 22407 (java) score 187 or sacrifice child 
1406786406 1406786406 0 3 127.0.0.1 2014-07-31T01:00:06-05:00 ahostname kern err kernel[76729.082625]: [76729.082625] 
    Killed process 22407 (java) total-vm:859680kB, anon-rss:304232kB, file-rss:608kB 
1406811608 1406811608 0 3 127.0.0.1 2014-07-31T08:00:08-05:00 ahostname kern err kernel[101910.841683]: [101910.841683] 
    Out of memory: Kill process 1370 (java) score 198 or sacrifice child 
1406811608 1406811608 0 3 127.0.0.1 2014-07-31T08:00:08-05:00 ahostname kern err kernel[101910.841686]: [101910.841686] 
    Killed process 1370 (java) total-vm:859928kB, anon-rss:332688kB, file-rss:560kB 

要更好地理解Linux系统内存不足时会发生什么,请参阅documentation。或者只是寻找“内存不足的杀手”。

发生什么事情是,当操作系统检测到内存不足时,它会开始查杀进程。有时这可能最终成为登录到系统的进程或其他关键进程。

您的Java过程本身可能不会导致中断,但它可能与运行在同一服务器上的其他事件相结合导致此问题。但在OOM Killer的日志中查找是一个很好的开始。

使用top来查看正在运行的其他进程正在使用系统上的其他内存,这也很好。按内存使用情况排序(最高内存优先),运行top后键入M

相关问题