案例分析
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虚拟内存导致长时间停顿