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

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

文章目录

  • 案例汇总
    • 1 .硬件升级系统反而卡顿的问题
    • 2. 线程池不当运用产生OOM问题
        • 提升--16---线程池--02---线程池7大参数、Executors工具类
    • 3. 实际系统不断重启,gc频繁
      • ==解决 OOM 2 大法宝==
        • 1. 扩大内存,
      • 2. 重启 jvm (12306---凌晨不卖票 ,有些游戏----定时系统维护)
    • 4. tomcat http-header-size过大问题(Hector)
    • 5. lambda表达式导致方法区溢出问题
    • 6. 直接内存溢出问题(少见)
    • 7. 栈溢出问题
    • 8. 重写finalize引发频繁GC
    • 9. System.gc()
    • 10. sql语句联合查询
  • 案例 tomcat堆溢出
  • MyBatis缓存导致OOM
    • Mybatis缓存
        • [MyBatis--03-- 一级缓存和二级缓存](https://blog.csdn.net/weixin_48052161/article/details/109850282)
    • 生产案例
    • 结论:
        • 批量程序,r如果对数据库==仅有select 操作==循环中,
        • 一定要记得==commit 或者update操作==,不然会缓存累积,最后导致OOM


案例汇总

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

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工具类

JVM调优--06---调优案例汇总_第2张图片

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

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

解决 OOM 2 大法宝

1. 扩大内存,

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

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

JVM调优--06---调优案例汇总_第3张图片
JVM调优--06---调优案例汇总_第4张图片
JVM调优--06---调优案例汇总_第5张图片
JVM调优--06---调优案例汇总_第6张图片
JVM调优--06---调优案例汇总_第7张图片
JVM调优--06---调优案例汇总_第8张图片

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");
        }
    }
}

JVM调优--06---调优案例汇总_第9张图片

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堆溢出

在这里插入图片描述
JVM调优--06---调优案例汇总_第10张图片
JVM调优--06---调优案例汇总_第11张图片
JVM调优--06---调优案例汇总_第12张图片
JVM调优--06---调优案例汇总_第13张图片
JVM调优--06---调优案例汇总_第14张图片
JVM调优--06---调优案例汇总_第15张图片
JVM调优--06---调优案例汇总_第16张图片
JVM调优--06---调优案例汇总_第17张图片
在这里插入图片描述

MyBatis缓存导致OOM

Mybatis缓存

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

JVM调优--06---调优案例汇总_第18张图片
JVM调优--06---调优案例汇总_第19张图片

JVM调优--06---调优案例汇总_第20张图片

生产案例


结论:

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

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

你可能感兴趣的:(JVM,java,开发语言,后端)