《码出高效:Java 开发手册》技术笔记
前言
《java開(kāi)發(fā)手冊(cè)》這本書(shū)是一本由阿里巴巴公司的開(kāi)發(fā)工程師們編寫(xiě)的技術(shù)書(shū)籍,
 相比于其他編程書(shū)籍,本書(shū)更為貼近一些共通的知識(shí)而非實(shí)際的代碼,對(duì)開(kāi)發(fā)工程師的綜合素質(zhì)有顯著的提升,本書(shū)共有九章,筆者計(jì)劃用八篇文章去記錄讀這本書(shū)的一些心得和體會(huì)
正文
首先是第一章,這章內(nèi)容主要是講一些基礎(chǔ)的計(jì)算機(jī)知識(shí),包括浮點(diǎn)數(shù),網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò)安全知識(shí),這些都是和日常開(kāi)發(fā)非常相關(guān)的一些東西
二進(jìn)制的加減法
計(jì)算機(jī)基本是0和1,二進(jìn)制,具體就是一條電路,具有高低電平兩種狀態(tài),日常說(shuō)的32位機(jī)器,就是2的32次方-1個(gè)狀態(tài);表示負(fù)數(shù)時(shí)就是最左一位為符號(hào)位,0正1負(fù),那么最大就是01111111,換算就是127
 同時(shí)二進(jìn)制數(shù)運(yùn)算時(shí)用補(bǔ)碼,正數(shù)的原反補(bǔ)碼三者相同,而負(fù)數(shù)補(bǔ)碼等于反碼+1,這樣底層減法也能當(dāng)加法算,減少運(yùn)算器消耗
位移運(yùn)算
位移運(yùn)算在開(kāi)發(fā)中可以見(jiàn)到,通常是用于進(jìn)行乘除2的n次方時(shí),進(jìn)行快速操作,底層操作是:右移n位時(shí)把這個(gè)數(shù)對(duì)應(yīng)的補(bǔ)碼最右邊抹去n位,最左分為兩種情況:負(fù)數(shù)補(bǔ)1,正數(shù)補(bǔ)0,左移同理
 
 
 這里連續(xù)三個(gè)>就是無(wú)符號(hào)
其他位運(yùn)算
還有一些位運(yùn)算就是按位與,按位取反 ( 符號(hào)為~)、按位與(符號(hào)為 &) 、接位或(符號(hào)為|)、接位異或等運(yùn)算
 按位與:比如獲取網(wǎng)段值,IP地址與掩碼255.255.255.0進(jìn)行按位與運(yùn)算得到高24位,即為當(dāng)前ip的網(wǎng)段,底層就是換成二進(jìn)制進(jìn)行與運(yùn)算
 邏輯與:&& ,有短路功能,左為false直接退出
 邏輯或:同邏輯與,左為true直接退出
 異或:無(wú)短路功能,左右不同為1,否則為0
浮點(diǎn)數(shù)
浮點(diǎn)數(shù)是相對(duì)于定點(diǎn)數(shù)來(lái)說(shuō)的,定點(diǎn)就是確定小數(shù)點(diǎn)的位置,由此確定整數(shù)和小數(shù)部分
 浮點(diǎn)數(shù)則是由科學(xué)計(jì)數(shù)法表示的,由符號(hào)位,有效數(shù)字,指數(shù)三部分組成,這點(diǎn)高中數(shù)學(xué)有講
 目前常用的就是單雙精度浮點(diǎn)數(shù)
 單精度:4字節(jié),32位,底層如圖
 在計(jì)算機(jī)學(xué)中,指數(shù)叫階碼,有效數(shù)字叫尾數(shù)
 符號(hào)位很簡(jiǎn)單:0正1負(fù)
 階碼其實(shí)是移碼, [x ] 移 = x+(2^n-1)(n 為 x的二進(jìn)制位數(shù),含符號(hào)位)
 尾數(shù)很簡(jiǎn)單,就是原碼
浮點(diǎn)數(shù)使用
使用時(shí)推薦使用雙精度,單精度容易出問(wèn)題
 
 如金融行業(yè)的貨幣表示,推薦使用整型存儲(chǔ)其最小單位的值,人民幣的分,美元的美分,用時(shí)再換算
 如圓周率要求存儲(chǔ)小數(shù)點(diǎn)后 1000 位數(shù)字,使用單雙精度難以保存,推薦使用數(shù)組存小數(shù)部分
 在比較浮點(diǎn)數(shù)時(shí),由于存在誤差,所以禁止通過(guò)判斷兩個(gè)浮點(diǎn)數(shù)是否相等來(lái)控制某些業(yè)務(wù)流程
 數(shù)據(jù)庫(kù)使用decimal,禁止使用單雙浮點(diǎn)
字符集與亂碼
01如何表示文字,是英文字母,那么就是大小寫(xiě)52個(gè),加上一些特殊字符,也就是 ASCII碼
 其中有一個(gè)特殊的換行符
 unix中是\n,
 windows :\r\n
 舊macos:\r
 新macos:\n
 而漢字的個(gè)數(shù)遠(yuǎn)遠(yuǎn)超過(guò)英文字符的個(gè)數(shù)
 GB2312:6712
 GBK :支持繁體,兼容gb2312
 GB18030:為gbk超集并兼容gbk
 unicode:規(guī)定了所有語(yǔ)言的字符,實(shí)現(xiàn) Unicode 的編碼格式有三種 , UTF-8 、 UTF-16 、 UTF -
 32
 實(shí)際開(kāi)發(fā)中,為了避免亂碼,服務(wù)器級(jí)別、 schema 級(jí)、表級(jí)別乃至列級(jí)別應(yīng)該規(guī)定一致的編碼
Cpu與內(nèi)存
Cpu是一塊高精密度集成電路板,承載運(yùn)算和控制,執(zhí)行指令功能,是編程的中心,通常與內(nèi)存的關(guān)系非常緊密;其主要組成是控制器和運(yùn)算器,由寄存器對(duì)這兩者進(jìn)行協(xié)調(diào)如下圖為cpu內(nèi)部邏輯結(jié)構(gòu)
 
 控制器:類(lèi)似一個(gè)編譯器,其中
 控制單元主要控制時(shí)序和指令
 指令譯碼器:在控制單元智慧下讀取分析指令,交由運(yùn)算器執(zhí)行
 指令寄存器:存儲(chǔ)指令集
 運(yùn)算器:ALU:算邏運(yùn)算單元,運(yùn)算器核心
 運(yùn)算器執(zhí)行01的計(jì)算
 寄存器:高速緩存L1L2,遠(yuǎn)小于內(nèi)存空間,成本也非常高
 部分處理器也有L3緩存
 相比C++可以malloc操作內(nèi)存,java都交給jvm操作內(nèi)存,也就是垃圾回收
TCP/IP
網(wǎng)絡(luò)協(xié)議
這里講到網(wǎng)絡(luò)協(xié)議,計(jì)算機(jī)之間需要網(wǎng)絡(luò)連接,而網(wǎng)絡(luò)協(xié)議就是規(guī)則,各方遵守規(guī)則就可以互相交流
 包括HTTP, HTTPS、 FTP 、SMTP 、 UDP, ARP 、 PPP 、 IEEE 802.x等協(xié)議
 TCP/IP協(xié)議也叫傳輸控制協(xié)議,是一個(gè)以TCPIP為核心的協(xié)議族
 它對(duì)網(wǎng)絡(luò)分層是4層
 鏈路層:以字節(jié)為單位對(duì)01分組做為數(shù)據(jù),添加源和目標(biāo)機(jī)器的物理地址,校驗(yàn)位,封成一個(gè)包傳輸
 
 網(wǎng)絡(luò)層:根據(jù)ip定義網(wǎng)絡(luò)地址,區(qū)分網(wǎng)段;子網(wǎng)內(nèi)用ARP協(xié)議進(jìn)行mac尋址,子網(wǎng)外通過(guò)路由轉(zhuǎn)發(fā)ip數(shù)據(jù)包
 傳輸層:數(shù)據(jù)包到了目標(biāo)計(jì)算機(jī)后,在傳輸層進(jìn)行確認(rèn)并交給應(yīng)用程序,這里一般是TCP和UDP協(xié)議
 應(yīng)用層:傳輸層信息到了應(yīng)用程序后,進(jìn)行解讀,通常有一個(gè)固定格式
IP協(xié)議
計(jì)算機(jī)有mac地址進(jìn)行區(qū)分,但這樣很多計(jì)算機(jī),找到過(guò)于費(fèi)時(shí),所以有ip地址進(jìn)行分段分層的管理,就類(lèi)似于快遞分省市縣層層分發(fā),最后快遞員喊小區(qū)的人取快遞
 IP地址屬于網(wǎng)絡(luò)層,在wlan內(nèi)進(jìn)行路由尋址,長(zhǎng)度32位4個(gè)字節(jié),掩碼用來(lái)區(qū)分子網(wǎng),下圖為ip協(xié)議格式,注意不是ip地址格式
 
 TTL:數(shù)據(jù)包的生存時(shí)間,代表可經(jīng)過(guò)路由器數(shù),經(jīng)過(guò)一個(gè)自減一,為0時(shí),數(shù)據(jù)包被丟棄并通知源主機(jī)
 ICMP:一個(gè)檢測(cè)網(wǎng)絡(luò)通暢,主機(jī)可達(dá)性的協(xié)議,ping,tracert這些命令就是基于ICMP的檢測(cè)網(wǎng)絡(luò)狀態(tài)的工具
TCP建立連接
TCP,又稱(chēng)傳輸控制協(xié)議,它是面向連接、確保數(shù)據(jù)在端到端間可靠傳輸?shù)膮f(xié)議
 面向連接是指?jìng)鬏斍跋冉⒁粭l信道
 可靠是指要確認(rèn)發(fā)出字節(jié)的編號(hào),校驗(yàn)數(shù)據(jù)包的有效性,超時(shí)重傳,滑動(dòng)窗口,擁塞控制等等
 
 服務(wù)端和客戶端:tcp的面向連接由這兩個(gè)端實(shí)現(xiàn),首先需要服務(wù)端在特定端口監(jiān)聽(tīng),然后客戶端發(fā)送
 SYN :用作建立連接時(shí)的同步信號(hào)
 ACK: 用于對(duì)收到的數(shù)據(jù)進(jìn)行確認(rèn),所確認(rèn)的數(shù)據(jù)由確認(rèn)序列號(hào)表示;
 FIN :表示后面沒(méi)有數(shù)據(jù)需要發(fā)送,通常意昧著所建立的連接需要關(guān)閉了。
 三次揮手:這個(gè)概念是計(jì)網(wǎng)基礎(chǔ)概念了
 A 機(jī)器發(fā)出一個(gè)數(shù)據(jù)包并將 SYN 置 l ,表示希望建立連接。這個(gè)包中的序列
 號(hào)假設(shè)是 x 。
 B 機(jī)器收到 數(shù)據(jù)包后,通過(guò) SYN 得知這是一個(gè)建立連接的請(qǐng)求,于是發(fā)送一個(gè)響應(yīng)包并將 SYN 和 ACK 標(biāo)記都置 l 。假設(shè)這個(gè)包中的序列號(hào)是 y ,而確認(rèn)序列號(hào)必須是 x+l ,表示收到了 A 發(fā)過(guò)來(lái)的 SYN
 A 收到 B 的響應(yīng)包后需進(jìn)行確認(rèn),確認(rèn)包中將 ACK 置 l ,并將確認(rèn)序列號(hào)
 設(shè)置為 y+ l ,表示收到了來(lái)自 B 的 SYN
 
 三次握手的原因很好理解,這張圖就可以解釋
 只有三次后才能確認(rèn)這八種能力,后續(xù)傳輸才能不出問(wèn)題
 還有一個(gè)就是兩次就會(huì)產(chǎn)生臟連接,因?yàn)閳?bào)文存活時(shí)間是大于tcp連接時(shí)間的
 從底層看,tcp連接通過(guò)fd文件描述符完成,linux中,很多資源都是通過(guò)fd數(shù)描述
 在協(xié)議層面,可以keep-alive,也就是定時(shí)發(fā)送數(shù)據(jù)包,表示健康狀態(tài),通常也可在應(yīng)用層發(fā)送心跳包檢查健康
TCP斷開(kāi)連接
作為一種全雙工連接,tcp連接需要四次握手
 
 第一步:A 想要關(guān)閉連接,待本方數(shù)據(jù)發(fā)送完畢后,傳遞 FIN 信號(hào)給 B。
 第二步:B 應(yīng)答 ACK ,告訴 A 可以斷開(kāi),但是需要等 B 處理完數(shù)據(jù),再主動(dòng)給 A 發(fā)送 FIN 信號(hào)。這時(shí), A 處于半關(guān)閉狀態(tài)( FIN WAIT 2 ),無(wú)法再發(fā)送新的數(shù)據(jù)。
 第三步:B 做好連接關(guān)閉前的準(zhǔn)備工作后,發(fā)送 FIN 給 A ,此時(shí)B 機(jī)器也進(jìn)入半關(guān)閉狀態(tài)( CLOSE_WAIT )。
 第四步A 發(fā)送針對(duì) B FIN 的 ACK 后,進(jìn)入 TIME - WAIT 狀態(tài),經(jīng)過(guò) 2MSL ( Maximum Segment Lifetime )后,沒(méi)有收到 B傳來(lái)的報(bào)文,確定 B 已經(jīng)收到 A 機(jī)器最后發(fā)送的 ACK 指令,此時(shí) TCP連接正式釋放。
TIME WAIT 和 CLOSE WAIT在實(shí)際業(yè)務(wù)中是優(yōu)化的兩個(gè)重點(diǎn),參數(shù)設(shè)置不當(dāng)會(huì)對(duì)服務(wù)器造成大量負(fù)載
連接池
對(duì)于大量的連接,頻繁創(chuàng)建斷開(kāi)會(huì)加重負(fù)載,這時(shí)就用連接池來(lái)重復(fù)利用連接,
 RPC 服務(wù)集群的注冊(cè)中心與服務(wù)提供方、消費(fèi)方之間,消息服務(wù)集群的緩存服務(wù)器和消費(fèi)者服務(wù)器之間,應(yīng)用后臺(tái)服務(wù)器和數(shù)據(jù)庫(kù)之間,都會(huì)使用連接池來(lái)提升性能。
 比較常用的就是數(shù)據(jù)庫(kù)層面連接池,以druid為例子,主要是連接數(shù)min和max的設(shè)置,如果 MIN 過(guò)小,可能會(huì)出現(xiàn)過(guò)多請(qǐng)求排隊(duì)等待獲取連接,如果 MIN 過(guò)大,會(huì)造成資源浪費(fèi)。如果 MAX 過(guò)小,則峰值情況下仍有很多請(qǐng)求處于等待狀態(tài);如果MAX 過(guò)大,可能導(dǎo)致數(shù)據(jù)庫(kù)連接被占滿,大量請(qǐng)求超時(shí),進(jìn)而影響其他應(yīng)用,引發(fā)服務(wù)器連環(huán)雪崩。
 這里還提到了數(shù)據(jù)庫(kù)的優(yōu)化手段:
 高效且合適的索引
 排查連接資源未顯式關(guān)閉的情形
 合并短的請(qǐng)求
 合理拆分多個(gè)表 join 的SQL ,若超過(guò)三個(gè)表則禁止 join
 使用臨時(shí)表
 應(yīng)用層優(yōu)化。 包括進(jìn)行數(shù)據(jù)結(jié)構(gòu)優(yōu)化、并發(fā)多線程改造等
 改用其他數(shù)據(jù)庫(kù)。
總結(jié)
以上是生活随笔為你收集整理的《码出高效:Java 开发手册》技术笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: sql中 N’ 的作用
- 下一篇: 2021年研究生数学建模竞赛优秀论文汇总
