`

《深入理解Java虚拟机》笔记之第5章 调优案例分析与实战

阅读更多

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 通过64JDK来使用大内存;

   2 使用若干个32位虚拟机建立逻辑集群来利用硬件资源。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics