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

 2019-12-22 11:02  阅读(769)
文章分类:JVM

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位虚拟机建立逻辑集群来利用硬件资源。

点赞(1)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 《深入理解Java虚拟机》笔记之第5章 调优案例分析与实战

相关推荐