我正在许多计算机上运行一个java程序,这些计算机在它们之间进行交互。经过几个小时(2-5小时)计算机开始失败(线程开始陷入死锁,消息开始丢失-如果你考虑到在第一个小时左右的事情运行得很好)。
我怀疑这是因为我内存太多了。我在linux上运行,这是top
的相关输出
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30376 username 18 0 976m 132m 6804 S 0 4.0 0:05.60 java
发布于 2009-11-04 16:08:29
另一件可能发生的事情是,你失去了联系。就在昨天,我的一个同事也遇到了这种情况。
ulimit -n
将告诉您可以打开多少个文件句柄;netstat -at
将告诉您打开了多少个套接字。当第二个数字接近第一个数字时,打开连接的尝试将开始失败。
在这种特殊情况下,当连接在使用后仍在OPEN_WAIT
中时,强制垃圾收集( Runtime.gc()
)会有所帮助。
发布于 2009-11-04 16:05:50
您可以通过查看JVM堆大小的状态并定期记录它,了解内存使用的趋势。从这些日志中,您可以绘制一个图表,并查看是否存在异常。(顺便说一句,拼图模式是正常的垃圾收集行为。)
// Memory status
Runtime runtime = Runtime.getRuntime();
final long totalMem = runtime.totalMemory();
final long freeMem = runtime.freeMemory();
if (log.isDebugEnabled()) {
log.debug("Memory free=" + freeMem +
" used=" + (totalMem - freeMem) +
" total=" + totalMem);
}
发布于 2009-11-04 16:27:42
可能的问题:
(
并发错误),在您有机会读取它或获得大于缓冲区的消息之前,从套接字上的缓冲区中丢失
。
https://stackoverflow.com/questions/1674716
复制相似问题