案例分析
5.2.1高性能硬件上的程序部署
1.通过64位JDK来使用大内存
- 内存回收导致长时间停顿
- 现阶段,64位JDK的性能测试结果普遍低于32位JDK
- 需要保证程序稳定,因为要是产生堆栈溢出几乎无法产生堆转储快照,产生了也无法分析
- 由于指针膨胀、数据类型对齐补白等因素,相同程序64位JDK消耗内存更大
2.使用若干个32位虚拟机建立逻辑集群来利用硬件资源
- 尽量避免节点竞争全局资源,例如磁盘竞争
- 很难最高效率的利用某些资源池
- 各节点不可避免的受到32位的内存限制
- 大量使用本地缓存的应用,逻辑集群中会造成内存浪费,考虑改为集中式缓存
5.2.2集群间同步导致内存溢出
- 当网络不稳定时,重发数据在内存会出现大量的堆积,很快就导致内存溢出了。
5.2.3堆外内存导致的溢出错误
- 除了Java堆和永久代之外,下面区域受操作系统进程最大内存的限制
- Direct Memory
- 线程堆栈
- socket缓存区
- JNI方法
- 虚拟机和GC
5.2.4外部命令导致系统缓慢
- Runtime.getRuntime().exec() 方法。Java 虚拟机执行这个命令的过程是:首先克隆一个和当前虚拟机一样环境变量的进程,然后用这个新的进程去执行外部命令,最后再退出这个进程。频繁的执行这个操作,不仅是CPU还有内存的压力很大。
5.2.5服务器JVM进程奔溃
- 解决方法:将异步调用改为生产者/消费者的消息队列实现。
5.2.6不恰当数据结构导致内存占用过大
5.2.7由windows虚拟内存导致长时间停顿