JVM调优实战
1.jvm调优分类
1.1JVM预调优:
根据业务场景,注重吞吐量还是注重响应时间;
提升硬件性能,最简单,但是成本最高。
1.2程序卡顿:
1.3OOM:
2.秒杀场景JVM调优:每秒2000并发量。采用负载均衡,平均每台服务器每秒500并发量。
场景一:大量的请求访问到服务器,造成JVM的新生代瞬间产生大量对象,占用大量内存,当survivor区域内的对象占到空间的一半儿时,直接将对象放入Old区。
那么许多朝生夕死的对象,就会进入到Old区。Old区进行FullGC时,采用标记整理的方式,比较耗时,所以,大量朝生夕死的对象进来到Old区后,比较耗费性能。
解决方案:增大新生代内存,使Survivor区内存不被占用太满而导致对象直接进入Old区。这样,朝生夕死的对象就不会直接进入Old区,这样就减少了FullGC的次数,提升了
效率。
缩小栈的内存,一般256k就够。
3.CPU占用过高100%的调优思路:
两种情况:线程死锁和GC频繁。
解决思路;Top命令查看占用CPU高的进程;用jstack输出线程信息;定位占用CPU高的线程;定位具体代码;
4.JVM调优实例
场景一:采用jdk线程池,设置了相应参数,但是请求数过多,导致线程池中阻塞队列中的对象过多,导致内存溢出,报OOM错误。报limit exceed错误。Old区全是阻塞队列的对象,但是GC不能将其回收,所以报这个错误。
场景二:static变量里,存入了过多的无关对象,造成了内存泄漏,从而发生了OOM。
连接(IO等)未关闭;
5.当已经发生OOM,需要排查时,就要用到dump堆日志文件了。
排查dump日志,用MAT工具。
内存泄漏如何排查:1.采用MAT工具分析。