专栏首页艾小仙最近线上发生的两个坑爹锅!

最近线上发生的两个坑爹锅!

最近由于在技改,发生了不少问题,前文中说的缓存穿透只是其中之一,想了想,虽然都是比较简单的问题,但是应该实际中还是有不少人碰到过,这些问题看似很简单,但是你绝对应该踩过。

==和equals

关于==和equals区别,我相信稍微做过一两年开发的同学都应该很清楚,可是,然而,这个坑在很多开发的时候仍然频繁出现,为什么?因为有时候有的同学认为没什么区别,就用==吧,然而,一些意外总是如期而至。

不久前,由于线上RPC框架切换,我们就发生了一点小问题。

本来,线上的接口是这样定义的:

然后,接口查询中使用到了一个枚举类型,根据id获取枚举值,只不过这里使用的是==号来判断。

调用方的写法:

本来,这个代码在线上跑了两年了,一点问题没有,怎么就突然不行了呢?

但是,切换框架之后,这个接口报错了,当时我也看了这个地方半天,猜测是这里的问题,但是想了想貌似又不应该啊。

结果最后发现,原来的RPC框架传输中使用的是valueOf,从缓存中取值,加上自动装箱拆箱,判断可以通过。但是,新的框架使用的是new Byte(),所以这个老代码就永远无法通过了,因为这是一个新的对象。

看看这个测试的结果。

后面,通过安装Alibaba Java Coding Guidelines插件统一扫描所有代码,还又发现了一个坑爹的问题。

这个写法又不太一样,这个枚举只是单纯的把code成员变量定义成了byte基础类型,不是包装类型。这样,代码用==判断又都OK了。

坑爹1

想象一下,因为是基础数据类型,拆箱后==判断当然是通过的。

还有更奇葩的写法,成员变量是Byte包装类型,getEnumByCode(byte code)这里用的又是基础类型,当然,这种写法也能判断通过。

坑爹2

所以,心累... ...

最后,我想再补充一下关于基础数据类型缓存的知识。能用==判断的原因也都是依赖于缓存的原因。

数据类型

包装类型

缓存类型

缓存值范围

byte

Byte

ByteCache

-128~127

short

Short

ShortCache

-128~127

int

Integer

IntegerCache

-128~127

long

Long

LongCache

-128~127

char

Character

CharacterCache

0~127

最后,奉劝大家一句,千万,千万,在项目中判断包装数据类型都用equals,因为就算这段代码你很确信现在是对的,然而鬼都不知道后面会发生什么!不要抱有侥幸心理。

日志打满

项目技改上线后不久,发现接口成功率直接跌0(跌0的告警监控必须得有,不然死都不知道怎么死的)。排查了很久,看其他都是正常的,最后发现GC耗时狂增,登录服务器一看,居然是硬盘被打满了。

然后果断去看日志,因为我们的硬盘实际上很小,先怀疑日志,果不其然,日志炸了。通过ls -lht查看文件大小。

通过rm -rf删除后发现硬盘空间并没有释放。正常情况下是不会出现这个问题的,但是如果文件被锁定或者有另外的进程在向文件写数据的话就会有问题了。

在Linux中,一个文件在文件系统中存放包含两个部分:

  1. 指针部分:指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了。
  2. 数据部分:而数据部分存储在磁盘中。

像上面的情况,虽然我们删除了service.log,但是由于进程锁定,指针部分没有从meta-data中删除,所以也就看到存储空间没有释放的问题。

解决办法有两种:

  1. 使用lsof -n |grep delete查看什么进程在写service.log,通过命令发现是我们的java进程在一直写文件,然后通过后台工具直接重启应用,重启之后发现恢复正常。
  2. 清空日志文件,执行命令echo "">/service.log,这个方法可以立刻释放磁盘空间,进程继续写入日志也不会受到影响。

- END -

本文分享自微信公众号 - 艾小仙(aixiaoxianren),作者:艾小仙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最新 Java 后端系列干货,都在这了!

    以下是Java技术栈微信公众号发布的所有关于 Java Web 技术干货,会从以下几个方面汇总,本文会长期更新。

    Java技术栈
  • 海思麒麟如何从坑货变为“显爹”一族?

    镁客网
  • docker获取Let's Encrypt永久免费SSL证书

    还不如野蛮生长的acme.sh,而这里介绍docker运行cerbot获取Let's Encrypt永久免费SSL证书

    ydymz
  • Eruda 一个小而美的调试神器

      日常工作中再牛逼的大佬都不敢说自己的代码是完全没有问题的,既然有问题,那就也就有调试,说到调试工具,大家可能对于fiddler、Charles、chrome...

    苏南
  • 【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space

    我在修改 ctf-wiki 目录后进行 mkdocs build 去生成索引目录的时候报错:

    Angel_Kitty
  • 从一个聚合SDK的Bug解决所展开的人生思考

    最近,公司有个做聚合SDK的老铁要离职了,然后它的锅就甩给我了,话说,本来开会的时候说和另一个同事一人负责半个月

    萬物並作吾以觀復
  • 世界上根本没有高并发

    昨天接了个新需求,小小的需求,大大的坑,先甩个锅,由于是接别人的代码,在上午与web联调后表示nice,联调通过,下午与app联调表示nice表示联调通过,问能...

    疯狂的KK
  • 一文揭秘,爬虫那些不为人知的套路

    1、真实世界的爬虫比例 大家应该听过一句话吧,大概意思是说,整个互联网上大概有50%以上的流量其实是爬虫。第一次听这句话的时候,我还不是很相信,我觉得这个说法实...

    BestSDK
  • 微信午报 | 微信「搜一搜」上线电商新入口;「腾讯乘车码」将登陆上海

    知晓君
  • 敖丙我把线上CPU打到100%,三歪吓尿了

    你们没发现我最近的原创原创少了很多嘛,一是最近花了很多时间做视频,本来我写文章就是利用周末的两天时间,但是现在基本上两天都要拍摄剪辑了,尽管请了小伙伴做字幕,还...

    敖丙
  • eruda 一个被人遗忘的调试神器

    日常工作中再牛逼的大佬都不敢说自己的代码是完全没有问题的,既然有问题,那就也就有调试,说到调试工具,大家可能对于fiddler、Charles、chrome ...

    苏南
  • 大数据那些事(19):有干爹的Cloudera

    英文有个说法叫Sugar Daddy。翻译成中文还是干爹比较合适。大家都知道文字在发展,近年来尤其在加速发展。同志,小姐都赋予了新的含义,随着长城的上演,干爹的...

    用户1564362
  • 权威报告预测比特币在2018年“王位”不保

    一分钟吐槽:比特币大王带领一众小币们重新涨回来啦!韭菜们前两天抄底的,这波车上得不亏! 1量子链、达世币、瑞波币、比特现金等集体上涨,币市回温 根据火币pro数...

    企鹅号小编
  • 辽宁移动宽带体验及魔百盒M101s-2刷机

    设备:移动赠送,华为光猫一只,魔百盒M101s-2电视盒子 一只,据安装人员说这个魔百盒是移动自己开发设计的。

    黯然销魂掌
  • Java程序员求职热点问题总结(持续更新)

    废话!硕士都满地跑了,本科生更要努力提高自己技术实力才能进好公司!优秀的人一直很优秀,自己欠的也都是要还的!谁再说读书无用论,建议先转行收租。

    JavaEdge
  • IIS6+Rewrite3重载隐藏index.php

    [ISAPI_Rewrite] RewriteEngine on RewriteCond %{HTTP:Host} ^phpfs.com$ RewriteRul...

    苦咖啡
  • Java 语言中十大“坑爹”功能!

    作为一门面向对象的编程语言,Java凭借其简单易用、功能强大的特点受到了广大编程爱好者的青睐,伴随着开源社区的推波助澜,Java语言更是席卷全球,势不可挡,在世...

    Java旅途
  • Java 令人失望的 10 大功能点

    作为一门面向对象的编程语言,Java凭借其简单易用、功能强大的特点受到了广大编程爱好者的青睐,伴随着开源社区的推波助澜,Java语言更是席卷全球,势不可挡,在世...

    开发者技术前线
  • “坑爹”排行榜:Java语言最违反常识的功能点TOP 10

    作为一门面向对象的编程语言,Java凭借其简单易用、功能强大的特点受到了广大编程爱好者的青睐,伴随着开源社区的推波助澜,Java语言更是席卷全球,势不可挡,在世...

    用户1564362

扫码关注云+社区

领取腾讯云代金券