内存溢出案例分析

集群间同步导致内存溢出
JBossCache的JGroups进行通信。保证各个数据节点的数据同步。主要故障一般出现在网络不稳定的情况下,会有大量的同步重发数据在协议栈中积累。当并发量大的时候,加之网络不稳定,就会在内存中堆积过多导致溢出。

堆外内存导致的溢出错误
cometD1.1.1框架,有大量的NIO操作,需要用大豆哦Direct Memory。容易造成堆外内存溢出。
Exception in thread "main" java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method)
at com.chinaso.phl.Server.main(Server.java:72)
垃圾收集的时候虚拟机虽然会对Direct Memory进行回收,但是不能像新生代和老年代一样,发现空间不足了就通知收集器进行垃圾回收,只能等待老年代满了后Full GC,然后"顺便"清理掉内存的废弃对象。
此案例可以合理通过合理设置-XX:MaxDirectMemorySize=1024m来解决。

外部命令导致系统缓慢
Runtime.getRuntime().exec()执行原理
    首先克隆一个和当前虚拟机拥有一样环境变量的进程,再用这个新的进程去执行外部命令,最后再退出这个进程。
    如果频繁执行这个操作,系统的消耗会很大,不仅是CPU,内存负担也很重。这种方法在JAVA虚拟机中非常消耗资源,即使外部命令本身很快能执行完毕,频繁调用时创建进程的开销也非常可观。

服务器JVM进程崩溃
远端异步调用等待,导致socket很长时间才能返回,并且返回结果都是中断,Connection Reset。时间越长,积累的越来越多的socket连接,最终超过虚拟机承受能力后,使虚拟机崩溃。改用消息队列可以良好的解决。

猜你喜欢

转载自phl.iteye.com/blog/2008030