一、大内存硬件上的程序部署
问题:网站不定期出现长时间失去响应
原因:垃圾收集停顿
解决:
1:单个虚拟机实例管理大内存,给堆分配足够大的堆内存,将Full GC频率控制足够低,可以通过定时任务触发Full GC
2:使用若干个虚拟机建立逻辑集群,在前端搭建一个负载均衡器,以反向代理的方式分配访问请求
二、集群间同步导致的内存溢出
问题:不定期出现多次内存溢出问题
原因:有一个负责安全校验的全局过滤器,导致各个节点之间网络交互过于频繁,重发数据在内存中堆积,产生内存溢出
解决:JBossCache的缺陷,MIS系统实现方式的缺陷
三、堆外内存导致的溢出错误
问题:服务端不定时抛出内存溢出异常,垃圾收集不频繁
原因:直接内存只能等Full GC时顺带回收
四、外部命令导致系统缓慢
问题:大并发压力测试时,发现请求响应时间慢
原因:用户请求的处理需要执行一个外部shell脚本,执行这个脚本需要创建进程,系统消耗大,内存负担重
解决:去掉脚本执行的语句,改为使用Java的API去获取这些信息
五、服务器虚拟机进程崩溃
问题:运行期间频繁出现集群节点的虚拟机进程自动关闭
原因:与一个OA门户集成后导致两边服务速度不对等,积累Web服务没有调用完成,等待的线程和Socket连接越来越多,超过虚拟机的承受能力后导致虚拟机进程崩溃
解决:通知OA门户方修复无法使用的集成接口,将异步调用改为生产者/消费者模式的消息队列
六、不恰当数据结构导致内存占用过大
问题:加载数据文件到内存进行数据分析时,minor GC停顿时间长
原因:存活对象更多,且主要HashMap<Long,Long>结构存储数据文件空间效率太低
七、由Windows虚拟内存导致的长时间停顿
问题:偶尔出现间隔约一分钟的时间无日志输出,处于停顿状态
原因:程序最小化时工作内存被自动交换到磁盘的页面文件中,发生垃圾收集时因为恢复页面文件的操作导致了不正常的收集停顿
解决:加入参数Dsun.awt.keepWorkingSetOnMinimize=true,保证程序在恢复最小化时能够立即响应
八、由安全点导致长时间停顿
问题:垃圾收集的停顿时间长,但是实际垃圾收集器进行回收的动作只占其中的几百毫秒
原因:部分线程已经走到了安全点,还有一些慢的线程并没有到
具体原因:虚拟机认为int类型或范围更小的数据类型作为索引值的可数循环不用设置安全点,但实际上这里的可数循环特别慢,所以大家都在等循环跑完才能进入安全点
解决:HotSpot原本提供了-XX:+UseCountedLoopSafepoints参数去强制在可数循环中也放置安全点,不过这个参数在JDK 8下有Bug[2],有导致虚拟机崩溃的风险,所以就不得不找到RpcServer线程里面的缓慢代码来进行修改