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