java虛擬機的堆里存放著(zhù)正在運行的java程序所創(chuàng )建的所有對象。當一個(gè)對象不再被程序引用時(shí),它所使用的堆空間可以被回收,以便后續的新對象所使用。垃圾收集器必須能夠斷定哪些對象是不再被引用的,并且能夠把它們所占據的堆空間釋放出來(lái)。在釋放不再被引用的對象的過(guò)程中,垃圾收集器運行將要被釋放的對象的終結方法(finalizer)。
除了釋放不再被引用的對象,垃圾收集器還要處理堆碎片。在一個(gè)虛擬內存系統中,增長(cháng)的堆所需要的額外分頁(yè)(或交換)空間會(huì )影響運行程序的性能。
垃圾收集
垃圾收集算法要做兩件事情
1) 檢測出垃圾對象
2)回收垃圾對象所使用的堆空間并還給程序
垃圾檢測通常通過(guò)建立一個(gè)根對象的集合并且檢查從這些根對象開(kāi)始的可觸及性來(lái)實(shí)現。如果正在執行的程序可以訪(fǎng)問(wèn)到的根對象和某個(gè)對象之前存在引用路徑,這個(gè)對象就是可觸及的。對于程序來(lái)說(shuō),根對象總是可以訪(fǎng)問(wèn)的。從這個(gè)根對象開(kāi)始,任何可以被觸及的對象都被認為是活動(dòng)對象。無(wú)法被觸及的對象被認為是垃圾,因為它們不在影響程序的執行。
java虛擬機的根對象集合根據實(shí)現而不同,但是總會(huì )包含局部變量中的對象引用和棧幀的操作數棧(以及類(lèi)變量中的對象引用)。另一個(gè)根對象的來(lái)源是被加載的類(lèi)的常量池中的對象引用,比如字符串。還有一個(gè)來(lái)源是傳遞到本地方法中的,沒(méi)有被本地方法釋放的對象引用。另一個(gè)潛在的根對象的來(lái)源是,java虛擬機運行時(shí)數據區中從垃圾收集器的堆中分配的部分。
區分活動(dòng)對象和垃圾的兩個(gè)基本方法是引用計數和跟蹤。
引用計數垃圾收集器通過(guò)為堆中的每一個(gè)對象保存一個(gè)計數來(lái)區分活動(dòng)對象和垃圾對象。這個(gè)計數記錄下了對那個(gè)對象的引用次數。
跟蹤垃圾收集器實(shí)際上追蹤從根結點(diǎn)開(kāi)始的引用圖。在追蹤中遇上的對象以某種方式打上標記,當追蹤結束時(shí),沒(méi)有被打上標記的對象就是被斷定是不可觸及的,可以被當作垃圾收集。
java程序的退出有兩種機制:一種是程序運行完成,自然退出.另一種是拋出異?;蛘咤e誤退出.
//因此當主線(xiàn)程啟動(dòng)一個(gè)子線(xiàn)程,并且主線(xiàn)程以以上任何一種方式退出后.
子線(xiàn)程是否繼續執行取決于這個(gè)線(xiàn)程是用戶(hù)線(xiàn)程還是守護線(xiàn)程.如果該子線(xiàn)程是用戶(hù)線(xiàn)程,該子線(xiàn)程會(huì )繼續執行.
如果該子線(xiàn)程是守護線(xiàn)程,該子線(xiàn)程會(huì )終結.//
//這里寫(xiě)得有問(wèn)題
應該是java程序啟動(dòng)一個(gè)線(xiàn)程,并且java程序以以上任何一種方式退出后.
在主線(xiàn)程退出,在jvm退出之前.jvm會(huì )判斷當前的進(jìn)程.
如果在沒(méi)有用戶(hù)進(jìn)程(有或沒(méi)有守護線(xiàn)程)的情況下,jvm會(huì )退出
該線(xiàn)程是否繼續執行取決于這個(gè)線(xiàn)程是用戶(hù)線(xiàn)程還是守護線(xiàn)程.如果該線(xiàn)程是用戶(hù)線(xiàn)程,該線(xiàn)程會(huì )繼續執行.
如果該線(xiàn)程是守護線(xiàn)程,該線(xiàn)程會(huì )終結.
聯(lián)系客服