Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >最近线上发生的两个坑爹锅!

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

作者头像
艾小仙
发布于 2021-01-14 02:23:29
发布于 2021-01-14 02:23:29
3000
举报
文章被收录于专栏:艾小仙艾小仙

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

==和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 -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 艾小仙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP-循环
2、如果明确知道循环多少次首先for循环,如要要循环到条件不成立为止选while或do-while
cwl_java
2020/03/26
2.8K0
php基础教程 第八步循环补充
上一节内容中,讲解了php中的循环,并且了解了for循环。for循环是php循环中的一种,在本节中继续讲解php循环:While循环、do…while循环、foreach 循环。
1_bit
2020/10/23
1.8K0
php基础教程 第八步循环补充
PHP-数组
数组可以使单个变量中存储多个值的特殊变量,php中的数组使用array();来定义,或者用[]来定义,php中的数组相当于python中的列表。在php中,有三种类型的数组: 数值数组:带有数字ID键的数组,等同于Python中的列表(list) 关联数组:带有指定的键的数组(Key->Vaule),等同于Python中的字典(dict) 多维数组:包含一个或多个数组的数组。 数值数组 1.创建数值数组 1.1 自动分配ID键(ID键是从0开始的) $cars=array("Volvo","BMW","
行 者
2018/03/26
5.2K0
Linux的shell命令——判断与循环
在Linux系统的Shell中,if 是用于条件判断的关键字,用于根据给定条件执行不同的代码块。以下是if语句的一般用法:
红目香薰
2023/10/11
1.4K0
php基础教程 第七步数组补充及循环基础
上一节中简单的了解了数组的定义、取值及存储,这一节补充一下上一节数组的内容。 在上一节中,我们知道索引是用来标记值的位置,通过索引可以取得当前位置的值。这种一个索引对应着一个值的关系是一个映射关系,称为键值对。键指的是索引,值指的是具体值。在某些编程语言中,这种关系的数组称为字典。
1_bit
2020/10/23
6670
php基础教程 第七步数组补充及循环基础
【深入浅出C#】章节 3: 控制流和循环:循环语句
循环语句是编程中常用的一种结构,用于重复执行特定的代码块。它的作用是在满足特定条件的情况下,反复执行一段代码,以实现重复性任务的自动化处理。循环语句在程序中具有重要的地位和作用。 循环语句的重要性体现在以下几个方面。首先,循环语句能够提高代码的复用性和效率,减少代码冗余。通过循环,我们可以将需要重复执行的代码块放入循环体中,避免了多次复制和粘贴相同的代码。其次,循环语句使程序可以处理大量数据或执行大规模的任务,从而提高程序的处理能力和效率。它可以让程序按需重复执行,处理大量数据集合或持续监控某些情况。此外,循环语句还可以实现特定的算法逻辑和控制流程,如排序、搜索、遍历等。 在编程中,循环语句是一种必备的工具,可以有效地解决各种重复性任务和问题。合理地运用循环语句能够简化代码的编写和维护,提高程序的可读性和可维护性。因此,对于开发人员来说,掌握循环语句的使用方法和技巧是至关重要的。它们可以帮助我们更高效地开发程序,处理大规模任务,并实现各种复杂的业务逻辑。
喵叔
2023/07/09
3830
PHP入门
       使用单引号包裹字符,即可定义字符串类型,也可以使用双引号包裹,但单引号的效率更高些。示例:
用户9979303
2022/10/28
1.2K0
公共平台开发本地环境搭建及开发基础
采用Windows+Apache+MySQL+php。选取的套件为wampServer。
一粒小麦
2019/07/18
1.9K0
公共平台开发本地环境搭建及开发基础
PHP-函数
创建函数的语法 //function创建函数的关键字 function functionName() { 要执行的代码; } 函数准则 函数的名称应该显示出他的功能 函数的名称必须以字母、下划线开头,不能以数字开头 无参数,无返回值的函数 1.创建无参数无返回值的函数 //function创建函数的关键字,后面是函数名 function writeName() {    //执行的代码块     echo "kai jim refsnes"; }   echo "my name is "; //调用函数
行 者
2018/03/26
6510
Shell编程-for循环
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2024/11/01
1020
Shell编程-for循环
循环语句大揭秘:while、do-while、for、foreach你都掌握了吗?
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/21
4160
循环语句大揭秘:while、do-while、for、foreach你都掌握了吗?
php代码抄写笔记
php变量类型松散,定义时变量一个类型,在之后可以赋予另一种类型的参数。 三种作用域:local、global、static global关键字用在函数内变量前表示声明以后使用的变量为全局变量。 static关键字用在函数内变量前表示该变量在函数执行完成后不销毁,且static关键字定义的变量赋予的仅是初始值,再次执行函数,不会执行定义中的赋值操作。
木尤
2020/07/14
4.1K0
Java——基础语法(一)
在Java中,变量需要先声明再使用,声明方式为"数据类型 变量名"。Java有八种基本数据类型:byte、short、int、long、float、double、char、boolean。除了基本类型,Java还支持引用类型,如字符串和数组。 下面我将更详细地介绍Java中的变量。
一只
2024/07/05
1310
php面试笔记(4)-php基础知识-流程控制
在面试中,考官往往喜欢基础扎实的面试者,而流程控制相关的考点,往往是大家容易忽视的一个点,今天冷月就来帮各位小伙伴们梳理一下,在面试中流程控制相关的注意点。
学长冷月
2020/08/02
5870
【JavaSE专栏14】Java 的 while 循环语句
while 语句是 Java 循环结构中的一类,本文将对 Java 中的 while 循环语句进行讲解。
Designer 小郑
2023/08/01
8770
【JavaSE专栏14】Java 的 while 循环语句
PHP中 yield生成器处理大数据文件、性能优化很有用
很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。
友儿
2022/09/11
1.4K0
java for foreach区别
在Java编程语言中,for循环和foreach循环都是常用的迭代方式。虽然它们都用于遍历数据集合,但它们之间有一些重要的区别。在本文中,我将深入探讨这些区别,帮助您理解何时应该使用哪种循环。
堕落飞鸟
2023/03/31
1.7K0
PHP- 控制流-循环语句-do...while(一)
先执行一次循环体,然后检查条件表达式的值。如果条件表达式的值为true,则继续执行循环体,否则退出循环。和while循环一样,条件表达式可以是任何有效的表达式,通常使用关系运算符(例如<、>、==、!=等)来比较变量的值。
堕落飞鸟
2023/04/26
3330
PHP | 顺序结构、条件结构、循环结构 知识梳理与运用实例
demo: 如果我们需要提供上课的提示信息,假设如果为周一则上午有课,如果为周三则下午有课,其它时间没课。
凌川江雪
2019/03/08
1.3K0
Shell语法入门与实例——test命令、判断符号[]、判断语句,循环语句
本文将详细介绍Shell语法中的test命令、判断符号[]、判断语句和循环语句,并提供丰富的案例来说明它们的用法和作用。
GeekLiHua
2025/01/21
2210
相关推荐
PHP-循环
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档