Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計語言憔儿。Java 技術(shù)具有卓越的通用性、高效性放可、平臺移植性和安全性,廣泛應(yīng)用于PC朝刊、數(shù)據(jù)中心耀里、游戲控制臺、科學超級計算機拾氓、移動電話和互聯(lián)網(wǎng)冯挎,同時擁有全球最大的開發(fā)者專業(yè)社群。
給你學習路線:html-css-js-jq-javase-數(shù)據(jù)庫-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
1 TCP 與 UDP
網(wǎng)絡(luò)層:IP協(xié)議咙鞍、ICMP協(xié)議房官、ARP協(xié)議、RARP協(xié)議和BOOTP協(xié)議续滋;
傳輸層:TCP協(xié)議與UDP協(xié)議翰守;
應(yīng)用層:FTP、HTTP疲酌、TELNET蜡峰、SMTP、DNS等協(xié)議朗恳;
HTTP是應(yīng)用層協(xié)議湿颅,其傳輸都是被包裝成TCP協(xié)議傳輸≈嘟耄可以用SOCKET實現(xiàn)HTTP油航。
Socket是一組接口,可以實現(xiàn)TCP怀浆,也可以實現(xiàn)UDP谊囚。在設(shè)計模式中,Socket其實就是一個門面模式揉稚,它把復(fù)雜的TCP/UDP協(xié)議族隱藏在Socket接口后面秒啦,對用戶來說,一組簡單的接口就是全部搀玖,讓Socket去組織數(shù)據(jù)余境,以符合指定的協(xié)議。
小編推薦一個學Java的學習裙【 六五零,五五四芳来,六零七 】含末,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習即舌!裙內(nèi)有開發(fā)工具佣盒,很多干貨和技術(shù)資料分享!
TCP --- 傳輸控制協(xié)議顽聂,提供的是面向連接肥惭、可靠的字節(jié)流服務(wù)。當客戶和服務(wù)器彼此交換數(shù)據(jù)前紊搪,必須先在雙方之間建立一個TCP連接蜜葱,之后才能傳輸數(shù)據(jù)。TCP提供超時重發(fā)耀石,丟棄重復(fù)數(shù)據(jù)牵囤,檢驗數(shù)據(jù),流量控制等功能滞伟,保證數(shù)據(jù)能從一端傳到另一端揭鳞。 理想狀態(tài)下,TCP連接一旦建立梆奈,在通信雙方中的任何一方主動關(guān)閉連接前野崇,TCP 連接都將被一直保持下去。斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開TCP連接的請求鉴裹。
UDP --- 用戶數(shù)據(jù)報協(xié)議舞骆,是一個無連接的簡單的面向數(shù)據(jù)報的運輸層協(xié)議。UDP不提供可靠性径荔,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)包發(fā)送出去督禽,但是并不能保證它們能到達目的地。由于UDP在傳輸數(shù)據(jù)包前不用在客戶和服務(wù)器之間建立一個連接总处,且沒有超時重發(fā)等機制狈惫,故而傳輸速度很快。
TCP連接的三次握手:要了解TCP鹦马,一定要知道?"三次握手胧谈,四次拜拜"所謂的三次握手,就是發(fā)送數(shù)據(jù)前必須建立的連接叫三次握手荸频,握手完了才開始發(fā)的菱肖,這也就是面向連接的意思。
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器旭从,并進入SYN_SEND狀態(tài)稳强,等待服務(wù)器確認场仲;
第二次握手:服務(wù)器收到syn包,必須確認客戶的SYN(ack=j+1)退疫,同時自己也發(fā)送一個SYN包(syn=k)渠缕,即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài)褒繁;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包亦鳞,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢棒坏,客戶端和服務(wù)器進入ESTABLISHED狀態(tài)燕差,完成三次握手。
2 Java Thread
程序:是一段靜態(tài)代碼俊抵,它是應(yīng)用軟件執(zhí)行的藍本谁不。
進程:是程序運行時的一個實例,對應(yīng)了從代碼加載徽诲、執(zhí)行的一個完整過程,此過程也對應(yīng)進程產(chǎn)生吵血、發(fā)展到消亡的過程谎替。
線程:比進程更小的執(zhí)行單位,一個進程在其執(zhí)行過程中蹋辅,可以產(chǎn)生多個執(zhí)行線程钱贯,即每個線程也有它的產(chǎn)生、發(fā)展到消亡的過程侦另。是一個動態(tài)概念秩命。
粒度層次不同,是兩個不同層次上的概念褒傅。進程是由操作系統(tǒng)來管理的弃锐,而線程則是由進程來管理。
共享資源不同殿托,不同進程的代碼霹菊、內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨立的,而一個進程內(nèi)的多線程是共享進程空間資源的支竹,有可能互相影響旋廷。
切換效率不同,線程本身的數(shù)據(jù)通常只有寄存器數(shù)據(jù)礼搁,以及一個進程執(zhí)行時使用的堆棧饶碘,所以線程比進程切換負擔小。
3.1 Thread生命周期及狀態(tài)模型
3.2 Thread 常用方法
Thread:
public static Thread?currentThread( ):返回當前線程對象馒吴,是一個靜態(tài)的方法扎运。
public static void?sleep( long millis):使當前線程進入睡眠狀態(tài)瑟曲,參數(shù)設(shè)定其等待時間,不會釋放鎖绪囱,靜態(tài)方法测蹲。
public static void?yield():使當前線程放棄執(zhí)行,切換到其它線程鬼吵,是一個靜態(tài)方法扣甲。
Thread Instance:
public void?start():啟動線程,JVM將調(diào)用此線程的run方法齿椅,結(jié)果是將同時運行兩個線程琉挖,當前線程和執(zhí)行run方法的線程。
public void?run():Thread的子類應(yīng)該重寫此方法涣脚,內(nèi)容應(yīng)為該線程應(yīng)執(zhí)行的任務(wù)示辈。
public void?stop():停止線程運行,并退出可執(zhí)行狀態(tài)遣蚀。 【已過時】
public void?resume():將暫停的線程繼續(xù)執(zhí)行矾麻。【已過時】
public void?suspend():使線程暫停執(zhí)行芭梯,不退出可執(zhí)行態(tài)险耀。【已過時】
public void?interrupt():中斷線程玖喘。
public void?join():在當前線程中加入調(diào)用join方法的線程A甩牺,直到線程A死亡才能繼續(xù)執(zhí)行當前線程。
public void?join(long millis):在當前線程中加入調(diào)用join方法的線程A累奈,直到到達參數(shù)指定的毫秒數(shù)或線程A死亡才能繼續(xù)執(zhí)行當前線程贬派。
public void?setPriority(int newPriority):設(shè)置線程優(yōu)先級。
public void?setDaemon(boolean on):設(shè)置是否為后臺線程澎媒。如果當前運行線程均為后臺線程則JVM停止運行搞乏。該方法必須在start()方法之前使用。
public final void?checkAccess():判斷當前線程是否有權(quán)力修改調(diào)用此方法的線程旱幼。
public boolean?isAlive():判斷線程是否處于執(zhí)行狀態(tài)查描。返回值true表示處于運行狀態(tài),false表示已停止柏卤。
Object:
public void?wait():在其他線程調(diào)用此對象的notify()方法或notifyAll() 方法前冬三,使當前線程進入等待狀態(tài),會釋放鎖缘缚。
public void?notify(): 喚醒在此對象監(jiān)視器上等待的單個線程勾笆。
public void?notifyAll():喚醒在此對象監(jiān)視器上等待的所有線程。
3.3 main() 主線程與子線程
主線程:Java應(yīng)用程序總是從主類的main()方法開始執(zhí)行桥滨。當JVM加載代碼窝爪,發(fā)現(xiàn)main方法之后弛车,啟動的線程稱作“主線程”,該線程負責執(zhí)行main方法蒲每。
子線程:在main方法的執(zhí)行中再創(chuàng)建的線程纷跛。
如果main方法中又創(chuàng)建了子線程,那么JVM就要在主線程和子線程之間輪流切換邀杏,main方法即使執(zhí)行完最后的語句贫奠,JVM也不會結(jié)束程序,JVM一直要等到程序中的所有線程都結(jié)束之后望蜡,才結(jié)束我們的Java應(yīng)用程序唤崭。
3.4 Thread 線程創(chuàng)建兩種方法
Thread類:Thread類的子類創(chuàng)建線程對象,子類重寫Thread類中的run()方法脖律;
在Java程序中創(chuàng)建多線程的方法之一是繼承Thread類谢肾,從Thread類派生一個子類,并創(chuàng)建這個子類的對象小泉,就可以產(chǎn)生一個新的線程芦疏。這個子類應(yīng)該重寫Thread類的run方法,在run方法中寫入需要在新線程中執(zhí)行的語句段微姊。這個子類的對象需要調(diào)用start方法來啟動眯分,新線程等待CPU調(diào)度將自動進入run方法。當前線程將同時繼續(xù)往下執(zhí)行柒桑。
當創(chuàng)建子類的多個線程對象時,其成員變量和run()方法中局部變量都是互不干擾的噪舀。
Runnable接口:使用Thread類直接創(chuàng)建線程對象魁淳,但需要傳入實現(xiàn)Runable接口的目標對象。
在編寫復(fù)雜程序時相關(guān)的類可能已經(jīng)繼承了某個基類与倡,而Java不支持多繼承界逛,在這種情況下,便需要通過實現(xiàn)Runnable接口來生成多線程纺座。
使用Thread創(chuàng)建線程對象時息拜,通常使用的構(gòu)造方法是:Thread(Runnable target),該構(gòu)造方法中的參數(shù)是一個Runnable類型的接口净响,因此少欺,在創(chuàng)建線程對象時必須向構(gòu)造方法的參數(shù)傳遞一個實現(xiàn)Runnable接口類的實例,該實例對象稱作所創(chuàng)線程的目標對象馋贤。
當線程調(diào)用start方法后赞别,一旦輪到它來享用CPU資源,目標對象就會自動調(diào)用接口中的run方法(接口回調(diào))配乓。
對于使用同一目標對象的線程仿滔,目標對象的成員變量自然就是這些線程的共享數(shù)據(jù)單元惠毁。不同run()方法中的局部變量互不干擾。
3.5 Thread 同步
synchronized —— 線程同步關(guān)鍵字
把需要修改數(shù)據(jù)的方法用關(guān)鍵字synchronized來修飾崎页,用于指定需要同步的代碼段或方法鞠绰,也就是監(jiān)視區(qū)。
當一個線程A使用一個synchronized修飾的方法時飒焦,其他線程想使用這個方法時就必須等待蜈膨,直到線程A 使用完該方法 (除非線程A使用wait主動讓出CUP資源)。
當被synchronized限定的代碼段執(zhí)行完荒给,就釋放對象鎖(信號量)丈挟。
3.6 Thread 通信
為了更有效地協(xié)調(diào)不同線程的工作,需要在線程間建立溝通渠道志电,通過線程間的“對話”來解決線程間的同步問題曙咽。
java.lang.Object 類的一些方法為線程間的通訊提供了有效手段。
一個線程在使用的同步方法中時挑辆,可能根據(jù)問題的需要例朱,必須使用wait() (掛起)方法使本線程等待,暫時讓出CPU的使用權(quán)鱼蝉,并允許其它線程使用這個同步方法洒嗤。其它線程如果在使用這個同步方法時如果不需要等待,那么它用完這個同步方法的同時魁亦,應(yīng)當執(zhí)行notify(), notifyAll()(恢復(fù))方法通知所有的由于使用這個同步方法而處于等待的線程結(jié)束等待渔隶。
3.7 Thread 調(diào)度機制
每個Java線程都有一個優(yōu)先級,其范圍都在1和10之間洁奈。?默認情況下间唉,每個線程的優(yōu)先級都設(shè)置為5。
在線程A運行過程中創(chuàng)建的新的線程對象B利术,初始狀態(tài)具有和線程A相同的優(yōu)先級呈野。可在線程創(chuàng)建之后的任何時候印叁,通過setPriority(int priority)方法改變其原來的優(yōu)先級被冒。
基于線程優(yōu)先級的線程調(diào)度:
具有較高優(yōu)先級的線程比優(yōu)先級較低的線程優(yōu)先執(zhí)行;
對具有相同優(yōu)先級的線程轮蜕,Java的處理是隨機的昨悼;
底層操作系統(tǒng)支持的優(yōu)先級可能要少于10個,這樣會造成一些混亂肠虽。因此幔戏,只能將優(yōu)先級作為一種很粗略的工具使用。最后的控制可以通過明智地使用yield()函數(shù)來完成税课;
假設(shè)某線程正在運行闲延,則只有出現(xiàn)以下情況之一痊剖,才會使其暫停運行:
一個具有更高優(yōu)先級的線程變?yōu)榫途w狀態(tài)(Ready);
由于輸入/輸出(或其他一些原因)垒玲、調(diào)用sleep陆馁、wait、yield方法使其發(fā)生阻塞合愈;
對于支持時間分片的系統(tǒng)叮贩,時間片的時間期滿;
通常佛析,我們在一個線程內(nèi)部插入yield()語句益老,這個方法會使正在運行的線程暫時放棄執(zhí)行,這時具有同樣優(yōu)先級的線程就有機會獲得調(diào)度開始運行寸莫,但較低優(yōu)先級的線程仍將被忽略不參加調(diào)度捺萌;
3.8 Thread 掛起與恢復(fù)
掛起?有時候兩個線程并不是同步的,即不涉及都需要調(diào)用一個同步方法膘茎,但線程也可能需要暫時的掛起桃纯。所謂掛起一個線程就是讓線程暫時讓出CPU的使用權(quán)限,暫時停止執(zhí)行披坏,但停止執(zhí)行的持續(xù)時間不確定态坦,因此不能使用sleep方法暫停線程。掛起一個線程需使用wait方法棒拂,即讓準備掛起的線程調(diào)用 wait 方法伞梯,主動讓出CPU的使用權(quán)限。
恢復(fù)?為了恢復(fù)該線程帚屉,其它線程在占有CUP資源期間壮锻,讓掛起的線程的目標對象執(zhí)行notifyAll()方法,使得掛起的線程繼續(xù)執(zhí)行涮阔;如果線程沒有目標對象,為了恢復(fù)該線程灰殴,其它線程在占有CPU資源期間敬特,讓掛起的線程調(diào)用notifyAll()方法,使掛起的線程繼續(xù)執(zhí)行牺陶。
小編推薦一個學Java的學習裙【 六五零伟阔,五五四,六零七 】掰伸,無論你是大牛還是小白皱炉,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習!裙內(nèi)有開發(fā)工具狮鸭,很多干貨和技術(shù)資料分享合搅!
3 Java數(shù)據(jù)結(jié)構(gòu)
線性表結(jié)構(gòu)一般分為三種:順序線性表多搀、單鏈表、雙鏈表灾部;特征:
一個特定的線性表康铭,應(yīng)該是用來存放特定的某一個類型的元素的(?元素的“同一性”);
除第一個元素外赌髓,其他每一個元素?有且僅有一個直接前驅(qū)从藤;除最后一個元素外,其他每一個元素?有且僅有一個直接后繼(?元素的“序偶性”)锁蠕;
元素在線性表中的“下標”?唯一地確定該元素在表中的相對位置( 元素的“索引性”)夷野;
二叉樹是樹形結(jié)構(gòu)的一個重要類型。許多實際問題抽象出來的數(shù)據(jù)結(jié)構(gòu)往往是二叉樹的形式荣倾,即使是一般的樹也能簡單地轉(zhuǎn)換為二叉樹悯搔,而且二叉樹的存儲結(jié)構(gòu)及其算法都較為簡單,因此二叉樹顯得特別重要逃呼。
二叉樹(BinaryTree)是n(n≥0)個結(jié)點的有限集鳖孤,它或者是空集(n=0),或者由一個根結(jié)點及兩棵互不相交的抡笼、分別稱作這個根的左子樹和右子樹的二叉樹組成苏揣。這個定義是遞歸的。由于左推姻、右子樹也是二叉樹平匈, 因此子樹也可為空樹。
二叉樹遍歷:由于被訪問的結(jié)點必是某子樹的根藏古,所以N(Node)增炭、L(Left subtlee)和R(Right subtree)又可解釋為根、根的左子樹和根的右子樹拧晕。NLR隙姿、LNR和LRN分別又稱為?先根遍歷、中根遍歷和后根遍歷厂捞。
隊列是一個常用的數(shù)據(jù)結(jié)構(gòu)输玷,是一種?先進先出(First In First Out, FIFO)?的結(jié)構(gòu),也就是說只能在表頭進行刪除靡馁,在表尾進行添加欲鹏。
棧是一種?后進先出(Last In First Out,LIFO)?的數(shù)據(jù)結(jié)構(gòu)。
4 JDK命令行工具
jps?: 只用于列出java的進程。
jstat?:可用于觀察Java應(yīng)用程序運行時信息的工具魄咕。
jinfo?:可用于查看正在運行的Java應(yīng)用程序的擴展參數(shù)盘寡,甚至支持在運行時修改部分參數(shù)尤误。
jmap?:生成Java應(yīng)用程序的堆快照和對象的統(tǒng)計信息侠畔。jmap -histo 2972 > heap.log
jhat?:用于分析Java應(yīng)用程序的堆快照內(nèi)容文件。jhat heap.log
jstack?: 用于導(dǎo)出Java應(yīng)用程序的線程堆棧袄膏。 jstack -l 2348 > jstack.log
5 靜態(tài)代理和動態(tài)代理
靜態(tài)代理:由程序員創(chuàng)建或工具生成代理類的源碼践图,再編譯代理類。所謂靜態(tài)也就是在程序運行前就已經(jīng)存在代理類的字節(jié)碼文件沉馆,代理類和委托類的關(guān)系在編譯期就確定了码党。
動態(tài)代理:動態(tài)代理類的源碼是在程序運行期間由JVM根據(jù)反射等機制動態(tài)的生成,所以不存在代理類的字節(jié)碼文件斥黑。代理類和委托類的關(guān)系是在程序運行期確定揖盘。
6 Http基礎(chǔ)
7.1 HTTP協(xié)議
一種通信協(xié)議,它允許將超文本標記語言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器锌奴。 一個屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議兽狭,由于其簡捷、快速的方式鹿蜀,適用于分布式超媒體信息系統(tǒng)箕慧。
HTTP協(xié)議的主要特點如下:
支持客戶/服務(wù)器模式,基于TCP實現(xiàn)茴恰;
簡單快速:客戶向服務(wù)器請求服務(wù)時颠焦,只需傳送請求方法和路徑。請求方法常用的有GET往枣、POST伐庭、DELETE、PUT分冈。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同圾另。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小雕沉,因而通信速度很快集乔;
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在?傳輸?shù)念愋陀?/b>?Content-Type?加以標記坡椒;
短連接:短連接的含義是限制每次連接只處理一個請求饺著。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后肠牲,即斷開連接。采用這種方式可以節(jié)省傳輸時間靴跛。
無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議缀雳。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息梢睛,則它必須重傳肥印,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大识椰。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快深碱。
7.2 CGI是什么
CGI(Common Gateway Interface),通用網(wǎng)關(guān)接口,它是一段程序,運行在服務(wù)器上如:HTTP服務(wù)器腹鹉,提供同客戶端HTML頁面的接口。利用程序的標準輸入輸出流敷硅,完成HTTP通信功咒。HTTP 是文本協(xié)議,每次請求的文本以標準輸入流的形式進入服務(wù)器端 CGI 程序绞蹦,創(chuàng)建進程力奋;然后進程的標準輸出流作為響應(yīng)。
CGI程序可以是Python腳本幽七,PERL腳本景殷,SHELL腳本,C或者C++程序等澡屡。?所有服務(wù)器端 HTTP 處理都是類 CGI 的原理猿挚,接受符合協(xié)議的標準輸入文本流,從標準輸出流輸出同樣符合協(xié)議的文本驶鹉,也就是“請求”和“響應(yīng)”绩蜻。
7.3 負載均衡、分布式集群
在負載均衡的思路下梁厉,多臺服務(wù)器為對等方式辜羊,每臺服務(wù)器都具有同等的地位,可以單獨對外提供服務(wù)而無須其他服務(wù)器的輔助词顾。通過負載分擔技術(shù)八秃,將外部發(fā)送來的請求按一定規(guī)則分配到對稱結(jié)構(gòu)中的某一臺服務(wù)器上,而接收到請求的服務(wù)器都獨立回應(yīng)客戶機的請求肉盹。
常用負載均衡技術(shù):反向代理負載均衡 (如Apache+JK2+Tomcat這種組合)昔驱,使用代理服務(wù)器可以將請求轉(zhuǎn)發(fā)給內(nèi)部的Web服務(wù)器,讓代理服務(wù)器將請求均勻地轉(zhuǎn)發(fā)給多臺內(nèi)部Web服務(wù)器之一上上忍,從而達到負載均衡的目的骤肛。這種代理方式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web服務(wù)器窍蓝,而這種代理方式是多個客戶使用它訪問內(nèi)部Web服務(wù)器腋颠,因此也被稱為反向代理模式。
客戶系統(tǒng)一般采用Apache httpd作為web服務(wù)器吓笙,即作為Tomcat的前端處理器淑玫,根據(jù)具體情況而定,有些情況下是不需要Apache httpd作為 web 服務(wù)器的,如系統(tǒng)展現(xiàn)沒有靜態(tài)頁面那就不需要Apache httpd絮蒿,那時可以直接使用Tomcat作為web服務(wù)器來使用尊搬。使用Apache httpd主要是它在處理靜態(tài)頁面方面的能力比Tomcat強多了。
會話親和:就是表示來自同會話的所有請求都由相同的 Tomcat 實例來處理土涝,這種情況下佛寿,如果Tomcat實例或所執(zhí)行的服務(wù)器機器失效,也會喪失Servlet的會話數(shù)據(jù)但壮。即使在集群系統(tǒng)中執(zhí)行更多的Tomcat實 例冀泻,也永遠不會復(fù)制會話數(shù)據(jù)。這樣是提高集群性能的一種方案茵肃,但不具備有容錯能力了腔长。
會話復(fù)制:只配置負載均衡還不行,還要 session 復(fù)制验残,也就是說其中任何一個 tomcat 的添加的 session 捞附,是要同步復(fù)制到其它 tomcat , 集群內(nèi)的 tomcat 都有相同的 session您没,使用會話復(fù)制鸟召,則當一個Tomcat實例宕掉時,由于至少還有另一個Tomcat實例保有一份會話狀態(tài)數(shù)據(jù)氨鹏,因而數(shù)據(jù)不會喪失欧募。但性能會 有所降低。
具有1-5工作經(jīng)驗的仆抵,面對目前流行的技術(shù)不知從何下手跟继,需要突破技術(shù)瓶頸的可以加群。在公司待久了镣丑,過得很安逸舔糖,但跳槽時面試碰壁。需要在短時間內(nèi)進修莺匠、跳槽拿高薪的可以加群金吗。如果沒有工作經(jīng)驗,但基礎(chǔ)非常扎實趣竣,對java工作機制摇庙,常用設(shè)計思想,常用java開發(fā)框架掌握熟練的可以加群遥缕。java架構(gòu)群:591240817 一起交流
其實無論是分布式卫袒,數(shù)據(jù)緩存,還是負載均衡单匣,無非就是改善網(wǎng)站的性能瓶頸夕凝,在網(wǎng)站源碼不做優(yōu)化的情況下烤蜕,負載均衡可以說是最直接的手段了。其實拋開這個名詞迹冤,放開了說,就是希望用戶能夠分流虎忌,也就是說把所有用戶的訪問壓力分散到多臺服務(wù)器上泡徙,也可以分散到多個 tomcat里,如果一臺服務(wù)器裝多個tomcat膜蠢,那么即使是負載均衡堪藐,性能也提高不了太多,不過可以提高穩(wěn)定性挑围,即容錯性礁竞。當其中一個主tomcat 當?shù)簦渌膖omcat也可以補上杉辙,因為tomcat之間實現(xiàn)了Session共享模捂。待tomcat服務(wù)器修復(fù)后再次啟動,就會自動拷貝所有 session數(shù)據(jù)蜘矢,然后加入集群狂男。這樣就可以不間斷的提供服務(wù)。如果要真正從本質(zhì)上提升性能品腹,必須要分布到多臺服務(wù)器岖食。
7Linux基礎(chǔ)
8.1 Linux啟動原理
CMOS:記錄?各項硬件參數(shù)且嵌入在主板上面的存儲器;BIOS:一個寫入到主板上的一個韌體(韌體就是寫入到硬件上的一個程序)舞吭。BIOS就是在開機的時候計算機系統(tǒng)會主動執(zhí)行的第一個程序了泡垃。
首先加載BIOS程序,通過BIOS程序去?加載CMOS信息羡鸥,取得主機的各項硬件配置蔑穴,并開始進行開機自檢,依據(jù)設(shè)置取得第一個可啟動的設(shè)備兄春;
加載執(zhí)行第一個啟動設(shè)備內(nèi)MBR的Boot Loader澎剥;
依據(jù)Boot Loader的?設(shè)置加載Kernel,Kernel會開始檢測硬件與加載驅(qū)動程序赶舆;
在硬件驅(qū)動成功后哑姚,?Kernel會主動調(diào)用init進程,而init會取得run-level信息芜茵;
init執(zhí)行?/etc/rc.d/rc.sysinit文件來準備軟件執(zhí)行的操作環(huán)境(如網(wǎng)絡(luò)叙量,時區(qū)等);
init執(zhí)行?run-level的各個服務(wù)啟動(script方式)九串;
init執(zhí)行?/etc/rc.d/rc.local文件绞佩;
init執(zhí)行?終端模擬程序mingetty來啟動login進程寺鸥,最后就等待用戶登錄;
8.2 Linux命令行工具
top?:?實時顯示系統(tǒng)中各個進程的資源占用狀況品山。前半部分是系統(tǒng)統(tǒng)計信息胆建,后半部分是進程占用資源狀況信息。
sar?:?周期性地對內(nèi)存和CPU使用情況進行采樣肘交。查看CPU使用情況:sar -u 1 3笆载;查看內(nèi)存使用情況:sar -r 1 3;查看I/O使用情況:sar -b 1 3
vmstat?:?周期性地統(tǒng)計CPU 內(nèi)存 swap 使用情況等信息涯呻。vmstat 1 3
iostat?:?周期性查看I/O信息凉驻。iostat 1 2
pidstat:功能強大的性能檢測工具,?不僅可以監(jiān)視進程的CPU复罐,I/O涝登,內(nèi)存資源,也可以監(jiān)視線程的性能情況效诅。
查看CPU使用情況: pidstat -p 1187 -u 1 3【-t 參數(shù)將系統(tǒng)性能的監(jiān)控細化到線程級別】
查看內(nèi)存使用情況: pidstat -p 1187 -r 1 3 【-t 參數(shù)將系統(tǒng)性能的監(jiān)控細化到線程級別】
查看I/O使用情況: pidstat -p 1187 -d 1 3 【-t 參數(shù)將系統(tǒng)性能的監(jiān)控細化到線程級別】
netstat:用于查看各種網(wǎng)絡(luò)相關(guān)信息胀滚,如網(wǎng)絡(luò)連接,路由表填帽,接口狀態(tài) (Interface Statistics)蛛淋,masquerade 連接,多播成員 (Multicast Memberships) 等等篡腌。
小編推薦一個學Java的學習裙【 六五零褐荷,五五四,六零七 】嘹悼,無論你是大牛還是小白叛甫,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習!裙內(nèi)有開發(fā)工具杨伙,很多干貨和技術(shù)資料分享其监!
netstat -na 來顯示所有連接的端口并用數(shù)字表示。
mpstat:用于獲取 CPU 相關(guān)統(tǒng)計信息限匣。mpstat -P ALL 5 2 顯示了系統(tǒng)中 CPU 的各種統(tǒng)計信息抖苦。–P ALL 選項指示該命令顯示所有 CPU 的統(tǒng)計信息。參數(shù) 5 2 指示該命令每隔 5 秒運行一次米死,共運行 2 次锌历。
pmap:report memory map of a process(查看進程的內(nèi)存映像信息)。
pmap -d 1
-x extended Show the extended format. 顯示擴展格式-d device Show the device format. 顯示設(shè)備格式-q quiet Do not display some header/footer lines. 不顯示頭尾行-V show version Displays version of program. 顯示版本