本章介绍了几个虚拟机真实案例并以这些案例来分析问题、解决问题的过程和eclipse优化配置。
案例分析
高性能硬件上的程序部署策略
解决方案:
- 建立5个32位JDK的逻辑集群
- 第个进程按2GB内存计算(其中堆固定为1.5G),占用了10G内存
- 另外建立一个Apache服务作为前端均衡代理访问门户。
- 响应速度:以为CMS收集器进行垃圾回收。
集群间同步导致的内存溢出
解决方案(无解):
- 让服务器带着参数:+HeapDumpOnOutOfMemoryError运行
堆外内存导致的溢出错误
解决方案:
- Direct Memory:-XX:MaxDirectMemorySize调用直接内存大小
- 线程堆栈:-Xss调整大小
- Socket缓存区
- JNI代码
- 虚拟机和GC
外部命令导致系统缓慢
问题原因:linux产生频繁产生新进程(”fork”系统调用)
解决方案:
- Runtime().getRuntime().exec() 调用shell脚本
- 克隆一个和当前虚拟机拥有一样环境变量的进程
- 再用这个新的进程去执行外部命令
- 最后退出这个进程。
- 去掉这个Runtime().getRuntime().exec() Shell脚本执行的语句
- 改为用Java的API去获取这些信息
服务器JVM进程崩溃
问题:MIS系统使用了异步调用Web服务通知OA系统,长期以往导致等待线程和Socket连接越来越多,直到崩溃。
解决方案:
- 通知OA门户方修复无法使用的集成接口
- 并将异步调用改为生产者/消费都模式的消息队列实现
不恰当数据结构导致内存占用过大
问题:使用了大对象,导致GC Parnew(复制算法)无法回收。
解决方案:
- 不修改程序(治标不治本):将Survivor去掉,加入-XX: SurvirorRatio=65536、-XX: MaxTenuringThreshold=0或-XX: AlwaysTenure
- 修改程序:?
由Window虚拟内存导致的长时间停顿
解决步骤:
- 加入参数:-XX: +PrintGCApplicationStoppedTime -XX: PringGCDateStamps - Xloggc: gclog.log
- 加入参数:-XX: +PrintReferenceGC参数
Eclipse运行速度调优
升级JDK1.6的性能变化及兼容问题
在eclipse.ini文件配置参数:-XX: MaxPermSize=256M
编译时间和类加载时间的优化
配置参数:-Xverify: none,禁止掉字节码验证过程。
调整内存设置控制垃圾收集频率
把-Xms和-XX:PermSize设置为-Xmx和-MaxPermSize参数值一样(避免运行自动扩容)。
优化方案:
- 把新生代容量提升到128M,避免新生代频繁GC
- 把Java堆、永久代的容量分别固定为512M、96M,避免内存扩展
选择收集器降低延迟
改用ParNew和CMS收集器来收集新生代、老年代。