第5章-调优安全分析与实战

本章介绍了几个虚拟机真实案例并以这些案例来分析问题、解决问题的过程和eclipse优化配置。

案例分析

高性能硬件上的程序部署策略

Alt text
解决方案:

  • 建立5个32位JDK的逻辑集群
  • 第个进程按2GB内存计算(其中堆固定为1.5G),占用了10G内存
  • 另外建立一个Apache服务作为前端均衡代理访问门户。
  • 响应速度:以为CMS收集器进行垃圾回收。

集群间同步导致的内存溢出

Alt text
解决方案(无解):

  • 让服务器带着参数:+HeapDumpOnOutOfMemoryError运行

堆外内存导致的溢出错误

Alt text
Alt text
解决方案:

  • Direct Memory:-XX:MaxDirectMemorySize调用直接内存大小
  • 线程堆栈:-Xss调整大小
  • Socket缓存区
  • JNI代码
  • 虚拟机和GC

外部命令导致系统缓慢

Alt text
问题原因:linux产生频繁产生新进程(”fork”系统调用)
解决方案:

  • Runtime().getRuntime().exec() 调用shell脚本
    • 克隆一个和当前虚拟机拥有一样环境变量的进程
    • 再用这个新的进程去执行外部命令
    • 最后退出这个进程。
  • 去掉这个Runtime().getRuntime().exec() Shell脚本执行的语句
  • 改为用Java的API去获取这些信息

服务器JVM进程崩溃

Alt text
Alt text
问题:MIS系统使用了异步调用Web服务通知OA系统,长期以往导致等待线程和Socket连接越来越多,直到崩溃。
解决方案:

  • 通知OA门户方修复无法使用的集成接口
  • 并将异步调用改为生产者/消费都模式的消息队列实现

不恰当数据结构导致内存占用过大

Alt text
问题:使用了大对象,导致GC Parnew(复制算法)无法回收。
解决方案:

  • 不修改程序(治标不治本):将Survivor去掉,加入-XX: SurvirorRatio=65536、-XX: MaxTenuringThreshold=0或-XX: AlwaysTenure
  • 修改程序:?

由Window虚拟内存导致的长时间停顿

Alt text
解决步骤:

  1. 加入参数:-XX: +PrintGCApplicationStoppedTime -XX: PringGCDateStamps - Xloggc: gclog.log
    Alt text
  2. 加入参数:-XX: +PrintReferenceGC参数
    Alt text

Eclipse运行速度调优

升级JDK1.6的性能变化及兼容问题

在eclipse.ini文件配置参数:-XX: MaxPermSize=256M

编译时间和类加载时间的优化

配置参数:-Xverify: none,禁止掉字节码验证过程。
Alt text

调整内存设置控制垃圾收集频率

把-Xms和-XX:PermSize设置为-Xmx和-MaxPermSize参数值一样(避免运行自动扩容)。
优化方案:

  • 把新生代容量提升到128M,避免新生代频繁GC
  • 把Java堆、永久代的容量分别固定为512M、96M,避免内存扩展
    Alt text

选择收集器降低延迟

改用ParNew和CMS收集器来收集新生代、老年代。
Alt text