JAVA異常、多線程、垃圾回收_第1頁
JAVA異常、多線程、垃圾回收_第2頁
JAVA異常、多線程、垃圾回收_第3頁
JAVA異常、多線程、垃圾回收_第4頁
JAVA異常、多線程、垃圾回收_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

異常、多線程、垃圾回收主講人:翟佳宇CompanyLogo主要內(nèi)容Java異常處理機(jī)制1多線程編程2垃圾回收機(jī)制3Java代碼優(yōu)化編程4CompanyLogo異常基本概念當(dāng)出現(xiàn)程序無法控制的外部環(huán)境問題(用戶提供的文件不存在,文件內(nèi)容損壞,網(wǎng)絡(luò)不可用等)時,Java就會用異常對象處理。異常的頂層父類:java.lang.Throwable參考實例:ShowException.javaCompanyLogo異常分類異常分類:檢查性異常java.lang.Exception(編譯異常)運(yùn)行期異常

java.lang.RuntimeException錯誤:java.lang.ErrorCompanyLogo異常分類檢查性異常:程序正確,但因為外在的環(huán)境條件不滿足而引發(fā)。例如:用戶錯誤及I/O問題---程序試圖打開一個不存在的遠(yuǎn)程端口或者打開不存在的文件。Java編譯器強(qiáng)制要求處理這類異常,如果不捕獲這類異常,程序講不能被編譯。參考實例:略CompanyLogo異常分類運(yùn)行異常程序存在bug如數(shù)組越界,0作為被除數(shù),這類異常一般通過程序來避免,Java編譯器強(qiáng)制要求處理這類異常編譯器檢測不到這類異常,不會完全排除參考實例:TypeCheckException.javaCompanyLogo異常分類錯誤:一般很少見,也很難通過程序解決。它可能源于程序的bug,更可能源于環(huán)境問題,如內(nèi)存耗盡,程序中無需處理,而由運(yùn)行環(huán)境處理。示例:這個沒法演示CompanyLogo異常處理方法異常處理方法:處理異常在可能出現(xiàn)異常的地方直接處理異常拋出異常異常拋給函數(shù)調(diào)用者,讓函數(shù)調(diào)用者去處理異常CompanyLogo異常處理方法(一)處理異常try{……}catch{……}finally{……}CompanyLogo異常處理方法(一)try{……}catch{……}在出現(xiàn)異常的地方終止執(zhí)行代碼,進(jìn)入catch語句,如果有多個catch語句則進(jìn)入匹配異常的catch塊中CompanyLogo異常處理方法(一)finally{……}如果把finally塊置于try…catch語句后,finally塊一般都會得以執(zhí)行,相當(dāng)于一個保障,即使前面的try塊發(fā)生異常而沒有處理對應(yīng)異常的catch塊,finally會馬上執(zhí)行CompanyLogo異常處理方法(一)關(guān)于finally注意以下情況中,finally塊將不會被完全執(zhí)行:finally塊中發(fā)生異常程序所在線程死亡在前面代碼中用了System.exit();關(guān)閉CPUCompanyLogo異常處理方法(二)拋出異常將異常拋給函數(shù)調(diào)用者,讓函數(shù)調(diào)用者去處理異常參考實例:ExceptionThrow.javaCompanyLogo主要內(nèi)容Java異常處理機(jī)制1多線程編程2垃圾回收機(jī)制3Java代碼優(yōu)化編程4CompanyLogo多線程編程線程概念線程→進(jìn)程進(jìn)程:進(jìn)程是指運(yùn)行中的應(yīng)用程序,每個進(jìn)程都有自己獨(dú)立的地址空間(內(nèi)存空間)CompanyLogo進(jìn)程←→線程計算機(jī)內(nèi)存空間:進(jìn)程三進(jìn)程二(eclipse)進(jìn)程一(eclipse)線程一線程二線程三……CompanyLogo進(jìn)程←→線程CompanyLogo多線程線程的創(chuàng)建方法通過繼承Thread類,并重寫run函數(shù)實現(xiàn)Runnable接口并且重寫run函數(shù)示例:創(chuàng)建一個線程對象,實現(xiàn)每隔一秒輸出helloworld并且在執(zhí)行指定次后結(jié)束CompanyLogo多線程為什么提供兩種方法?因為Java是單繼承的,在某些情況下一個類已經(jīng)繼承了某個父類,這是再用繼承的方式來創(chuàng)建線程已經(jīng)不可能了,這樣就提出了另外一種方法來創(chuàng)建線程:通過Runnable接口來創(chuàng)建。CompanyLogo多線程兩種方法的區(qū)別本質(zhì)上沒有區(qū)別。但是實現(xiàn)是有所區(qū)別:通過繼承Thread類實現(xiàn) Humanhu=newHuman(); //運(yùn)行start函數(shù)后線程進(jìn)入運(yùn)行狀態(tài)(Running) hu.start();通過實現(xiàn)Runnable接口實現(xiàn) Human2hu=newHuman2(); ThreadT = newThread(hu); T.start();在編寫程序時,盡量使用接口實現(xiàn)進(jìn)程類CompanyLogo線程的狀態(tài)關(guān)系創(chuàng)建Runnable(可執(zhí)行狀態(tài))Running(運(yùn)行狀態(tài))Blocked(阻塞狀態(tài))Dead(死亡狀態(tài))出生可以工作參加工作人生發(fā)生意外,失去了工作能力CompanyLogo多線程操作線程的方法線程的休眠Thread.sleep()線程的加入Thread.join()線程的中斷Terrupt()線程的禮讓Thread.yeild()CompanyLogo線程的操作方法(一)線程的休眠sleep(longmillis)Thread類的sleep方法用于讓當(dāng)前線程暫時休眠一段時間參數(shù)millis的單位是毫秒示例:略CompanyLogo線程的操作方法(二)線程的加入join()處在“執(zhí)行狀態(tài)”的線程如果調(diào)用了其他線程的join方法,將被掛起進(jìn)入“阻塞狀態(tài)”目標(biāo)線程執(zhí)行完畢后才會解除阻塞,回到“可執(zhí)行狀態(tài)”例如:A/B是兩個線程,在線程A中調(diào)用線程B.join(),此時線程A將被阻塞,直到線程B執(zhí)行完畢舉例:com.bupt.MultiThread.JoinThreadTest.javaCompanyLogo線程的操作方法(三)線程的中斷Interrupt()在線程受到阻塞時拋出一個中斷信號,這樣線程就得以退出阻塞的狀態(tài)。更確切的說,如果線程被Object.wait,Thread.join和Thread.sleep三種方法之一阻塞,那么,它將接收到一個中斷異常(InterruptedException),從而提早地終結(jié)被阻塞狀態(tài)。Terrupt()方法不會中斷一個正在運(yùn)行的線程。舉例:com.bupt.MultiThread.InterruptThreadTest.java

CompanyLogo線程的操作方法(四)線程的禮讓yield()它只是給當(dāng)前正處于運(yùn)行狀態(tài)下的線程一個提醒,告知它可以將資源讓給其他線程,但這只是一種暗示,沒有任何一種機(jī)制保證當(dāng)前線程會將資源禮讓。使具有相同優(yōu)先級的線程有機(jī)會進(jìn)入可執(zhí)行的機(jī)會。對支持多任務(wù)的操作系統(tǒng)來說,不需要調(diào)用yield()方法,因為操作系統(tǒng)會為線程自動分配CPU時間來執(zhí)行

CompanyLogo多線程線程同步的引出鐵路賣票系統(tǒng)示例:SellTicketSys.java

CompanyLogo線程同步多線程應(yīng)用程序同時訪問共享對象時,由于線程間相互搶占CPU的控制權(quán),造成一個線程夾在另一個線程的執(zhí)行過程中運(yùn)行,所以可能導(dǎo)致錯誤的執(zhí)行結(jié)果。

CompanyLogo對象鎖線程同步為了防止共享對象在并發(fā)訪問時出現(xiàn)錯誤,Java中提供了“synchronized”關(guān)鍵字。synchronized關(guān)鍵字確保共享對象在同一時刻只能被一個線程訪問,這種處理機(jī)制稱為“線程同步”或“線程互斥”。Java中的“線程同步”基于“對象鎖”的概念CompanyLogo對象鎖Java對象鎖示例:CompanyLogo同步方法使用synchronized關(guān)鍵字同步方法被“synchronized”關(guān)鍵字修飾的方法稱為“同步方法”當(dāng)一個線程訪問對象的同步方法時,被訪問對象就處于“鎖定”狀態(tài),訪問該方法的其他線程只能等待

CompanyLogo同步塊使用synchronized關(guān)鍵字同步塊如果只希望同步部分代碼行,可以使用“同步塊”

同步塊的作用與同步方法一樣,只是控制范圍有所區(qū)別

在多線程應(yīng)用程序中,obj代表被鎖定的共享對象CompanyLogo線程同步正確的售票系統(tǒng)示例:SynchronousSellTicketSys.java

CompanyLogo多線程線程間的通信線程之間的通信使用wait()、notify()、notifyAll()方法實現(xiàn)

CompanyLogo多線程同步wait()調(diào)用wait()函數(shù)可以讓一個線程等待某個條件發(fā)生變化,但是這個變化不是當(dāng)前線程能夠控制的。Wait()會在外部等待世界產(chǎn)生變化的時候把任務(wù)掛起,并且只有在notify()、notifyAll()發(fā)生時才會被喚醒并且去檢查所產(chǎn)生的變化。Sleep方法調(diào)用是不釋放鎖,但是wait方法會釋放鎖,讓其他需求該鎖方法執(zhí)行notify()、notifyAll()從wait狀態(tài)中喚醒線程

CompanyLogo多線程注意只能在同步方法或者同步塊中調(diào)用wait()、notify()、notifyAll(),如果在非同步塊或者同步方法中調(diào)用這些方法,程序能通過編譯,但是運(yùn)行的時候會得到j(luò)ava.lang.IllegalMonitorStateException異常。這個異常的原因就是當(dāng)前線程沒有獲得對象的鎖,或者說,當(dāng)前調(diào)用的對象不是鎖對象。調(diào)用wait(),notify(),notifyAll()的對象必須是當(dāng)前鎖對象。常見的毛病就是使用了線程對象來調(diào)用這些方法CompanyLogo主要內(nèi)容Java異常處理機(jī)制1多線程編程2垃圾回收機(jī)制3Java代碼優(yōu)化編程4CompanyLogo垃圾回收機(jī)制概念GC(GarbageCollection)垃圾回收是Java程序設(shè)計中內(nèi)存管理的核心概念,JVM的內(nèi)存管理機(jī)制被稱為垃圾回收機(jī)制。一個對象創(chuàng)建后被放置在JVM的堆內(nèi)存中,當(dāng)永遠(yuǎn)不再引用這個對象時,它將被JVM在堆內(nèi)存中回收。被創(chuàng)建的對象不能再生,同時也沒有辦法通過程序語句釋放它們。

CompanyLogo垃圾回收機(jī)制

classnode{ intvalue; nodenext;}…nodep,q;p=newnode();q=newnode();q=p;CompanyLogo垃圾回收機(jī)制GC的基本原理對于程序員來說,分配對象使用new關(guān)鍵字;釋放對象時,只要將對象所有引用賦值為null,讓程序不能夠再訪問到這個對象,我們稱該對象為"不可達(dá)的".GC將負(fù)責(zé)回收所有"不可達(dá)"對象的內(nèi)存空間。GC通過確定對象是否被活動對象引用來確定是否收集該對象。GC首先要判斷該對象是否是時候可以收集。兩種常用的方法引用計數(shù)對象引用遍歷

CompanyLogoGC常用收集器(一)引用計數(shù)收集器原理:引用計數(shù)是垃圾收集器中的早期策略。在這種方法中,堆中每個對象(不是引用)都有一個引用計數(shù)。當(dāng)一個對象被創(chuàng)建時,且將該對象分配給一個變量,該變量計數(shù)設(shè)置為1。當(dāng)任何其它變量被賦值為這個對象的引用時,計數(shù)加1(a=b,則b引用的對象+1),但當(dāng)一個對象的某個引用超過了生命周期或者被設(shè)置為一個新值時,對象的引用計數(shù)減1。任何引用計數(shù)為0的對象可以被當(dāng)作垃圾收集。當(dāng)一個對象被垃圾收集時,它引用的任何對象計數(shù)減1。

CompanyLogoGC常用收集器(一)引用計數(shù)收集器優(yōu)缺點優(yōu)點:引用計數(shù)收集器可以很快的執(zhí)行,交織在程序運(yùn)行中。對程序不被長時間打斷的實時環(huán)境比較有利。缺點:引用計數(shù)器增加了程序執(zhí)行的開銷,因為每次對象賦給新的變量,計數(shù)器加1,而每次現(xiàn)有對象出了作用域生,計數(shù)器減1。CompanyLogoGC常用收集器(二)標(biāo)記-清除收集器原理:這種收集器首先遍歷對象圖并標(biāo)記可到達(dá)的對象,然后掃描堆棧以尋找未標(biāo)記對象并釋放它們的內(nèi)存。這種收集器一般使用單線程工作并停止其他操作。并且,由于它只是清除了那些未標(biāo)記的對象,而并沒有對標(biāo)記對象進(jìn)行壓縮,導(dǎo)致會產(chǎn)生大量內(nèi)存碎片,從而浪費(fèi)內(nèi)存。注意:只有當(dāng)堆滿的時候,才開始標(biāo)記-清除過程。首先,遍歷跟蹤運(yùn)行時棧指向的所有引用,把他們指向的內(nèi)存設(shè)為標(biāo)記。然后檢測堆塊中沒有標(biāo)記的塊,釋放這些內(nèi)存。

CompanyLogoGC常用收集器(二)標(biāo)記-清除收集器優(yōu)缺點優(yōu)點:也許永遠(yuǎn)不需要運(yùn)行跟蹤收集器,因為只有在heap滿的時候才運(yùn)行。跟蹤收集器可以發(fā)現(xiàn)并釋放所有不可用的內(nèi)存缺點:GC需要停止其他的活動。這種方法意味著所有與應(yīng)用程序相關(guān)的工作停止,只有GC運(yùn)行。在運(yùn)行期間這種不可預(yù)期的中斷也許是某些應(yīng)用不能接受的。

CompanyLogoGC常用收集器(三)復(fù)制收集器原理:這種收集器將堆棧分為兩個域,常稱為半空間。每次僅使用一半的空間,JVM生成的新對象則放在另一半空間中。GC運(yùn)行時,它把可到達(dá)對象復(fù)制到另一半空間,從而壓縮了堆棧。這種方法適用于短生存期的對象,持續(xù)復(fù)制長生存期的對象則導(dǎo)致效率降低。并且對于指定大小堆來說,需要兩倍大小的內(nèi)存,因為任何時候都只使用其中的一半。

CompanyLogoGC常用收集器(三)復(fù)制收集器優(yōu)缺點優(yōu)點:相比于標(biāo)記-清除收集器,復(fù)制收集器較快。缺點:只能使用一半的堆空間。

CompanyLogo總結(jié)垃圾收集器的作用Java語言規(guī)范沒有明確地說明JVM使用哪種垃圾回收算法,但是任何一種垃圾回收算法一般要做2件基本的事情:發(fā)現(xiàn)無用信息對象回收被無用對象占用的內(nèi)存空間,使該空間可被程序再次使用其他垃圾收集器

CompanyLogo主要內(nèi)容Java異常處理機(jī)制1多線程編程2垃圾回收機(jī)制3Java代碼優(yōu)化編程4CompanyLogoJava優(yōu)化編程盡量復(fù)用對象例如String對象的使用中,出現(xiàn)字符串連接情況時應(yīng)用StringBuffer代替。示例:

Stringa=“hello”;Stringb=“world”;a=a+b;helloworldhelloworldabCompanyLogoJava優(yōu)化編程換作StringBuffer

StringBuffera=“hello”;StringBufferb=“world”;a=a+b;helloworldabhelloworldJava優(yōu)化編程由于JVM的有其自身的GC機(jī)制,不需要程序開發(fā)者的過多考慮,從一定程度上減輕了開發(fā)者負(fù)擔(dān),但同時也遺漏了隱患,過分的創(chuàng)建對象會消耗系統(tǒng)的大量內(nèi)存,嚴(yán)重時會導(dǎo)致內(nèi)存泄露,因此,保證過期對象的及時回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC并非十分的機(jī)智,即使對象滿足了垃圾回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應(yīng)手動置成null。Java優(yōu)化編程盡量減少對變量的重復(fù)計算

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論