一、案例分析
-
高性能硬件上的程序部署策略
64位的JDK,缺点:内存回收导致长时间停顿。
性能低于32位JDK。内存消耗大,例如类型对齐补白。
=====================
对于CUP资源敏感度高的场景,选择"吞吐量优先"收集器。
对于追求低停顿的场景,选择CMS收集器。 -
集群间同步导致的内存溢出
-
堆外内存导致的溢出错误
当JVM运行时抛出OutOfMemoryError异常时,堆内各个区域的内存都表示内存充足无压力。可以考虑Derect Memory区域是否内存不足,且无法GC。
在32位的操作系统中。一般给每个线程分配2G的内存,堆占用1.6G,剩下的0.4G分配给Drect Memory。
Drect Memory的GC和堆区域不同,只有进行Full GC是顺带进行Drect Memory区域的GC,所以在这种情境下产生内存溢出异常。 -
外部命令导致系统缓慢
-
服务器JVM进程崩溃
-
不恰当数据结构导致内存占用过大
例如使用HashMap的集合结构,实际数据的存储内存为16B(2*8B)但是因为各种原因总占用的空间为88B。空间效率为16B/88B=18%。
应当适当的更改数据结构使内存占用减少。 -
由Windows虚拟内存导致的长时间停顿
二、实战:Eclipse运行速度调优
-
调优前的程序运行状态
-
升级JDK的性能变化及兼容问题
-
编译时间和类加载时间的优化
-
调整内存设置控制垃圾收集频率
-
选择收集器降低延迟