1、案例:
(1)集群间同步导致的内存溢出。
使用JBossCache这种集群缓存来同步,构建全局缓存。可以允许读操作频繁,因为数据在本地内存有一份副本,读取的动作不会耗费多少资源,但不应当有过于频繁的写操作,这会带来很大的网络同步的开销。
(2) 堆外内存导致的溢出错误。
Direct Memory区的内存溢出。Direct Memory不能像新生代和老年代那样,发现空间不足就通知垃圾回收器进行垃圾回收,它只能等待Full GC时“顺便”帮它进行清理。否则,它只能等到抛出内存溢出异常时,先catch掉,再在catch块里面“大喊”一声:”System.gc()!”。要是虚拟机还是不听(譬如打开了-XX:+DisableExplicitGC),那就能只能眼睁睁地看着堆中还有许多空闲内存,自己却不得不抛出内存溢出异常。如cometD 1.1.1框架,就有大量的NIO操作需要用到Direct Memory.
最后,通过-XX:MaxDirectMemorySize调整其大小。
(3) 外部命令导致系统缓慢。
发现请求响应时间比较慢,通过操作系统的mpstat工具发现CPU使用率很高,并且用绝大多数CPU资源的程序并不是应用系统本身,而是”fork”系统调用。修改相应的代码。
2、在高性能硬件上部署程序,目前主要有两种方式:
(1) 通过64的JDK来使用大内存;
(2) 使用若干个32位虚拟机建立逻辑集群来利用硬件资源。