• 那些年我经历过的奇葩 bug


    1. JDK 版本号引发的血案

    在 server 上把 JDK 版本从 1.8.231 升级成了 1.8.261,然后一个服务崩溃了……

    大家一脸懵逼地查原因,兜兜转转无数层后,终与发现一个底层依赖的不知名 jar 包试图去获取 JDK 版本号,然而用了一个 byte 去存储这个版本号,然后因为 261 超出范围溢出了……溢出了……

    2. 又一个 JDK 升级引发的血案

    这个动作稍大点,把 JDK 从 1.6 升成了 1.8, 然后又一个服务崩溃了……这个查起来又费了半天劲,最终发现原因是原先不知谁写的,for 循环一个 HashMap,然而这个循环顺序竟然是有依赖关系的!也就是说必须先遍历某个元素才行。JDK 8 升级了 hash 函数,然后这个顺序就变了,然后就挂了……

     3. 打 log 也能把程序内存打爆?

    开发者都永远也想不到用户会怎么用他的程序。log4j 有一个功能,就是在 MDC 中设置用户自定义的属性,例如用户名,这样子在这个 session 内 log 内容就可以把用户名打在 log 中。结果一个天才发现了,这个 MDC 是同一 session 内可访问的耶,正好有些对象传递,但又不能改动接口,因为改接口影响太大,把 MDC 当成共享内存来用好了。恶例就此打开,更过分的是他还把这个写成了公用函数,别人以为这是啥高科技纷纷调用,后果可想而知,Java 程序员很少有删除对象的习惯,一开始大家还都没发现,直到很久以后,随着服务量逐渐攀升,终于有一天内存爆了。一群人排查了一整天才抓到罪魅祸首,如果不是那哥们儿已经跑路了可能会被打……

    4. 又一个打 log 的奇葩 bug

    有天觉得 log 打得太多了,就把 log level 从 debug 调到了 info,然后发现服务不可用了,这个倒定位得很快,发现了神人写的如下代码, 差不多像这面这样子:

    log.debug("result count: " + dao.update());

  • 相关阅读:
    想要快速上手 Spring Boot?看这些教程就足够了!| 码云周刊第 81 期
    Eclipse Java注释模板设置详解以及版权声明
    java跨域解决
    微信公众号创建
    Java与JS生成二维码与条形码
    Java基础break、continue语句的用法
    分布式文件系统介绍
    Hadoop的RPC机制及简单实现
    RPC简介与hdfs读过程与写过程简介
    JVM的Client模式与Server模式
  • 原文地址:https://www.cnblogs.com/lldwolf/p/14665316.html
Copyright © 2020-2023  润新知