php简单购物网站源码,自己做购物网站好吗,南京企业网站搭建,林州网站建设哪家专业案例一个网站为了实现客户端实时从服务端接收数据#xff0c;使用了 CometD 1.1.1 作为服务端推送框架#xff0c;服务器是 Jetty7.1.4#xff0c;CPU i5#xff0c;内存 4G#xff0c;操作系统 32位Windows。服务端常常抛出内存溢出异常#xff0c;管理员把堆开到最大(3…案例一个网站为了实现客户端实时从服务端接收数据使用了 CometD 1.1.1 作为服务端推送框架服务器是 Jetty7.1.4CPU i5内存 4G操作系统 32位Windows。服务端常常抛出内存溢出异常管理员把堆开到最大(32位系统最多到1.6G)但问题依旧。开着 jstat 观察GC并不频繁eden、survivor、老年代、永久代的内存都很正常没有压力。查看日志中有异常信息...java.lang.OutOfMemoryError:null...at java.nio.DirectByteBuffer ...原因这是由 Direct Memory 不足引起的。操作系统对每个进程能管理的内存是有限制的32位windows的限制是2G其中1.6G给了Java堆但 Direct Memory 是不计入这 1.6G的因此 Direct Memory 最大就是 0.4G。垃圾回收时虽然会对 Direct Memory 进行回收但不像新生代、老年代那样发现空间不足时就触发回收只能等老年代满了之后 full gc 时随便把 Direct Memory 清理一下否则只能等抛出异常后进行catch调用 System.gc()。这个案例中使用了 CometD有大量的 NIO 使用 Direct Memory所以产生了这个问题。总结我们平时对堆比较关注但一定要记得除了堆之外下面这些区域也会占用较多的内存需要注意Direct Memory可以通过 -XX:MaxDirectMemorySize调整大小内存不足时抛出 OutOfMemoryError或者OutOfMemoryError:Direct buffer memory线程堆栈可通过 -Xss调整大小内存不足时抛出 StackOverflowError(纵向无法分配即无法分配新的栈帧)或者OutOfMemoryError:unable to create new native thread(横向无法分配即无法建立新的线程)Socket 缓存区每个socket连接都有 receive 和 send 两个缓存区分别占大约 37K 和 25K连接多时占用的内存也很可观如果无法分配抛出异常 IOException: Too many open files 。