一個關於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,這會有什麼問題?