一个关于byte数组的解析:
因为是String类型
图形a对应的的十进制是97,二进制是0110 0001
图形1对应的的十进制是49,二进制是0011 0001
图形2对应的的十进制是50,二进制是0011 0010
图形3对应的的十进制是51,二进制是0011 0011
图形4对应的的十进制是52,二进制是0011 0100
图形c对应的的十进制是99,二进制是0110 0011
buffer.get():读取一个字节,是0110 0001,对应97,读取后,buffer的position后移一位
buffer.getShort():读取两个字节,是读取到图形1、2,为二进制:0011 0001 0011 0010,转换成十进制是:2的13次方+2的12次方+2的8次方+2的5次方+2的4次方+2=12594
一个关于ByteBuffer解析:
buffer.putShort((short) 1):因为short是两个字节,当前buffer是:00000000 00000001
buffer.putInt(2):因为int是四个字节,当前buffer是:00000000 00000001 00000000 00000000 00000000 00000010
以此类推
buffer.get()从buffer读取一个字节,即8位,00000000=十进制0,
读取后,当前buffer是:00000001 00000000 00000000 00000000 00000010
buffer.getShort()从buffer读取两个字节,即16位,00000001 00000000=十进制2的8次方=256
以此类推
计算机里面的数据,很难读懂。
一道面试题:
变量a是一个64位有符号的整数,初始值用16进制表示为:0x7FFFFFFFFFFFFFFF
变量b是一个64位有符号的整数,初始值用16进制表示为:0x8000000000000000
则a+b的结果用10进制表示为多少:
答:a+b=0xFFFFFFFFFFFFFFFF,转换为二进制为:11111....111111(64位1),有符号数,第一位是符号位,1开头代表负数,计算机中负数以补码的形式保存,对于负数:将除符号位之外按位取反,末尾加1,即得到原码:11111....111111取反得到100....00000,加1,100....00001,即为10进制-1
一个关于不恰当使用netty导致内存泄漏问题的排查:
项目介绍:假设A是一个明星,每次A来上海,都会启动一个ServerBootstrap:
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group);
当A启动后,会有大量的粉丝与之建立tcp长连接,A需要离开上海了,会直接断开自己的serverchannel
现在项目运行后,存在严重的内存泄漏问题
第一次调整:A需要离开上海了,会直接断开自己的serverchannel(但A之前维护了每个粉丝与之建立tcp长连接),现在呢,直接断开自己的serverchannel,先close所有的粉丝的tcp长连接,再断开自己。
第一次调整结果:毛用没有
第二次调整:ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(group);项目中,这个EventLoopGroup group是多个明星都共享的,且由于parentGroup、childGroup都用的是同一个group,这会有什么问题?