JVM调优--06---调优案例汇总

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优--06---调优案例汇总相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


案例汇总

1 .硬件升级系统反而卡顿的问题

2. 线程池不当运用产生OOM问题

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 从数据库中读取信用数据,套用模型,并把结果进行记录和传输
 */

public class T15_FullGC_Problem01 

    private static class CardInfo 
        BigDecimal price = new BigDecimal(0.0);
        String name = "张三";
        int age = 5;
        Date birthdate = new Date();

        public void m() 
    

    private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,
            new ThreadPoolExecutor.DiscardOldestPolicy());

    public static void main(String[] args) throws Exception 
        executor.setMaximumPoolSize(50);

        for (;;)
            modelFit();
            Thread.sleep(100);
        
    

    private static void modelFit()
        List<CardInfo> taskList = getAllCardInfo();
        taskList.forEach(info -> 
            // do something
            executor.scheduleWithFixedDelay(() -> 
                //do sth with info
                info.m();

            , 2, 3, TimeUnit.SECONDS);
        );
    

    private static List<CardInfo> getAllCardInfo()
        List<CardInfo> taskList = new ArrayList<>();

        for (int i = 0; i < 100; i++) 
            CardInfo ci = new CardInfo();
            taskList.add(ci);
        

        return taskList;
    


提升–16—线程池–02—线程池7大参数、Executors工具类

3. 实际系统不断重启,gc频繁

  • 解决问题 加内存 + 更换垃圾回收器 G1
  • 真正问题在哪儿?不知道

解决 OOM 2 大法宝

1. 扩大内存,

2. 重启 jvm (12306—凌晨不卖票 ,有些游戏----定时系统维护)

4. tomcat http-header-size过大问题(Hector)






5. lambda表达式导致方法区溢出问题

public class LambdaGC 
    public static void main(String[] args) 
        for(;;) 
            I i = C::n;
        
    

    public static interface I 
        void m();
    

    public static class C 
        static void n() 
            System.out.println("hello");
        
    


6. 直接内存溢出问题(少见)

  • 《深入理解Java虚拟机》P59,使用Unsafe分配直接内存,或者使用NIO的问题

7. 栈溢出问题

  • Xss设定太小

8. 重写finalize引发频繁GC

小米云,HBase同步系统,系统通过nginx访问超时报警,最后排查,C++程序员重写finalize引发频繁GC问题

  • 为什么C++程序员会重写finalize?(new delete)
  • finalize耗时比较长(200ms)

9. System.gc()

如果有一个系统,内存一直消耗不超过10%,但是观察GC日志,发现FGC总是频繁产生,会是什么引起的?

  • 有人调用 System.gc() (这个比较Low)

10. sql语句联合查询

  • 用jvm都会溢出,mycat用崩过,1.6.5某个临时版本解析sql子查询算法有问题,9个exists的联合sql就导致生成几百万的对象

案例 tomcat堆溢出










MyBatis缓存导致OOM

Mybatis缓存

MyBatis–03-- 一级缓存和二级缓存


生产案例


结论:

批量程序,r如果对数据库仅有select 操作循环中,

一定要记得commit 或者update操作,不然会缓存累积,最后导致OOM

以上是关于JVM调优--06---调优案例汇总的主要内容,如果未能解决你的问题,请参考以下文章

JVM调优参数方法工具以及案例总结

大厂Java高级面试题汇总解答,超详细

面试官:如何进行 JVM 调优(附真实案例)

面试官:如何进行 JVM 调优(附真实案例)

面试官:如何进行 JVM 调优(附真实案例)

JVM综合调优汇总