国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      管理內(nèi)存的方法和設(shè)備的制作方法

      文檔序號:6609477閱讀:137來源:國知局
      專利名稱:管理內(nèi)存的方法和設(shè)備的制作方法
      技術(shù)領(lǐng)域
      根據(jù)本發(fā)明的設(shè)備和方法涉及管理內(nèi)存,更具體地講,涉及通過有效地 執(zhí)行無用單元收集(garbage collection)來管理內(nèi)存。
      背景技術(shù)
      在動(dòng)態(tài)地管理內(nèi)存的系統(tǒng)中,每當(dāng)預(yù)定程序運(yùn)行時(shí),應(yīng)該分配和收集內(nèi) 存。為程序中所使用的對象分配內(nèi)存以進(jìn)行存儲(chǔ)和訪問,而已經(jīng)結(jié)束使用的 對象被去除以確保內(nèi)存。因此,在傳統(tǒng)的C語言中,程序員使用諸如"malloc,, 或"free"的指令來分配內(nèi)存和收集內(nèi)存。
      然而,與傳統(tǒng)的C語言不同,在Java中,不需要程序員來分配和收集內(nèi) 存。通過Java虛擬機(jī)中包括的無用單元收集器(garbage collector)來執(zhí)行內(nèi) 存管理。 一旦預(yù)定程序運(yùn)行,Java虛擬機(jī)就首先分配運(yùn)行所述預(yù)定程序所需 的存儲(chǔ)區(qū)。這被稱為堆(heap)。運(yùn)行該程序所需的對象被存儲(chǔ)在堆中以被訪 問。無用單元收集器刪除存儲(chǔ)在堆中的對象中的沒有^^f吏用的對象并進(jìn)行緊 湊處理,以便有效地管理內(nèi)存。
      無用單元收集器確定對象是否被引用以確定該對象是否被使用,并且僅 從內(nèi)存中去除沒有被使用的對象。因此,當(dāng)僅使用無用單元收集器來管理內(nèi) 存時(shí),使用的對象不被去除,從而不會(huì)發(fā)生引用內(nèi)存中不存在的對象的虛引 用(dangling reference )。
      然而,與Java實(shí)日于頭見范(real-time specification for Java)相似,在一些 編程語言中,可由程序員單獨(dú)指定將使用的存儲(chǔ)區(qū),因此可能發(fā)生問題。
      圖l是解釋根據(jù)Java實(shí)時(shí)規(guī)范管理內(nèi)存的現(xiàn)有技術(shù)的方法的框圖。參照 圖1,使用Java實(shí)時(shí)規(guī)范中的兩種方法來管理內(nèi)存。
      一個(gè)程序可由多個(gè)線程組成。例如,在聊天程序的情況下,分別存在將
      用戶輸入的文本發(fā)送給另 一用戶的線程以及接收由另 一用戶輸入的文本的線程。
      一個(gè)程序中存在的多個(gè)線程可根據(jù)它們的特性被劃分為實(shí)時(shí)線程15和 普通線程16。實(shí)時(shí)線程15必須在固定的時(shí)間優(yōu)先于普通線程16而運(yùn)行。因 此,搶占實(shí)時(shí)調(diào)度器11調(diào)整線程的優(yōu)先級以將實(shí)時(shí)線程15調(diào)度為優(yōu)先于普 通線程16運(yùn)4亍。
      當(dāng)運(yùn)行普通線程16時(shí),運(yùn)行該線程所需的對象被存儲(chǔ)在堆13中,并且 訪問所述對象以運(yùn)行線程。這里,無用單元收集器12管理內(nèi)存并確定存儲(chǔ)在 堆13中的對象是否被使用。然后,在確定對象沒有被使用之后,從內(nèi)存中去 除確定沒有被使用的對象,并使剩余對象緊湊。
      當(dāng)運(yùn)行實(shí)時(shí)線程15時(shí),獨(dú)立于堆13設(shè)置多個(gè)存儲(chǔ)區(qū)14,運(yùn)行所述線程 所需的對象被存儲(chǔ)在存儲(chǔ)區(qū)14中以被訪問。存儲(chǔ)區(qū)14的每一個(gè)都可被一個(gè) 或多個(gè)實(shí)時(shí)線程15引用。當(dāng)引用的線程全部結(jié)束時(shí),存儲(chǔ)區(qū)14連同其包括 的對象一起被去除。
      如圖1中所示,當(dāng)內(nèi)存管理被二元化為堆13和存儲(chǔ)區(qū)14時(shí),可能產(chǎn)生 下面的問題。
      將堆13當(dāng)作對象而對堆13執(zhí)行的無用單元收集花費(fèi)很長時(shí)間。已開發(fā) 了進(jìn)行無用單元收集的各種算法。然而,它們需要花費(fèi)很長時(shí)間(例如,最 多長達(dá)幾秒鐘)。
      因此,不管運(yùn)行實(shí)時(shí)線程15的調(diào)度如何,如果首先進(jìn)行無用單元收集, 則實(shí)時(shí)線程15的運(yùn)行被延遲,延遲的時(shí)間不能被估計(jì)。搶占實(shí)時(shí)調(diào)度器11 僅調(diào)整實(shí)時(shí)線程15和普通線程16之間的優(yōu)先級,因此不能防止這樣的問題。
      當(dāng)已經(jīng)進(jìn)行無用單元收集,而需要運(yùn)行實(shí)時(shí)線程15時(shí),也會(huì)發(fā)生問題。 如果實(shí)時(shí)線程15的運(yùn)行應(yīng)該等待,直到無用單元收集結(jié)束,則實(shí)時(shí)線程15 不能正常運(yùn)行,在固定的時(shí)間運(yùn)行實(shí)時(shí)線程15應(yīng)該是最重要的任務(wù)。
      此外,每個(gè)存儲(chǔ)區(qū)14具有不同的壽命。因此,包括在具有長壽命的存儲(chǔ) 區(qū)中的對象引用包括在具有相對短的壽命的存儲(chǔ)區(qū)中的對象。當(dāng)具有短壽命 的存儲(chǔ)區(qū)被去除時(shí),可能發(fā)生虛引用。
      這將參照圖2更全面地進(jìn)行描述。
      圖2示出由實(shí)時(shí)線程15引用存儲(chǔ)區(qū)14的現(xiàn)有技術(shù)的方法。
      參照圖2 ,線程A引用依次從存儲(chǔ)區(qū)1至存儲(chǔ)區(qū)3的多個(gè)存儲(chǔ)區(qū)。在Java
      實(shí)時(shí)規(guī)范中,從存儲(chǔ)區(qū)棧中首先刪除最后引用的存儲(chǔ)區(qū)(后入先出)。在圖2
      中,存儲(chǔ)區(qū)3在存儲(chǔ)區(qū)2或存儲(chǔ)區(qū)1被刪除之前被刪除。因此,如果這些存 儲(chǔ)區(qū)的每一個(gè)沒有被除了線程A之外的線程引用,則存儲(chǔ)區(qū)3的壽命比存儲(chǔ) 區(qū)1的壽命短。
      如果存儲(chǔ)區(qū)3被刪除,而包括在存儲(chǔ)區(qū)1中的對象仍引用包括在存儲(chǔ)區(qū) 3中的對象,則包括在存儲(chǔ)區(qū)1中的對象引用了不存在的內(nèi)存中的對象。
      此外,當(dāng)包括在堆13中的對象引用了包括在存儲(chǔ)區(qū)中的對象時(shí),該存儲(chǔ) 區(qū)可能被刪除,因此可能發(fā)生虛引用。Java虛擬機(jī)僅確定是否存在引用存儲(chǔ) 區(qū)的線程。當(dāng)引用存儲(chǔ)區(qū)的線程不存在時(shí),該存儲(chǔ)區(qū)被刪除。因此,當(dāng)包括 在堆13中的對象引用包括在存儲(chǔ)區(qū)中的對象時(shí),即使該對象仍被使用,該存 儲(chǔ)區(qū)也可能被刪除。在這種情況下,包括在堆13中的對象引用了內(nèi)存中的不 存在的對象,因此發(fā)生虛引用。
      因此,需要一種確保實(shí)時(shí)線程15實(shí)時(shí)運(yùn)行并防止產(chǎn)生虛引用的非法引用 的管理內(nèi)存的方法。

      發(fā)明內(nèi)容
      本發(fā)明提供一種通過有效地進(jìn)行無用單元收集來管理內(nèi)存的方法和設(shè)備。
      本發(fā)明還提供一種具有用于上述方法的計(jì)算機(jī)程序的計(jì)算機(jī)可讀介質(zhì)。 根據(jù)本發(fā)明的一方面,提供一種管理內(nèi)存的方法,該方法包括對無用
      無用單元收集;根據(jù)所述調(diào)度對所述堆進(jìn)行無用單元收集。
      進(jìn)行無用單元收集的步驟可包括根據(jù)Java實(shí)時(shí)規(guī)范來進(jìn)行無用單元收集。
      所述堆可包括存儲(chǔ)區(qū),用于運(yùn)行實(shí)時(shí)線程的對象包括在所述存儲(chǔ)區(qū)中。 進(jìn)行無用單元收集的步驟可包括對包括在堆中的存儲(chǔ)區(qū)進(jìn)行無用單元收集。
      根據(jù)本發(fā)明的另一方面,提供一種管理內(nèi)存的設(shè)備,該設(shè)備包括調(diào)度 器,對無用單元收集進(jìn)行調(diào)度,以在實(shí)時(shí)線程的運(yùn)行結(jié)束之后對內(nèi)存中的預(yù) 定堆進(jìn)行無用單元收集;無用單元收集器,根據(jù)所述調(diào)度對所述預(yù)定堆進(jìn)行 無用單元收集。 無用單元收集器可根據(jù)Java實(shí)時(shí)規(guī)范來進(jìn)行無用單元收集。 所述預(yù)定堆可包括存儲(chǔ)區(qū),用于運(yùn)行實(shí)時(shí)線程的對象包括在所述存儲(chǔ)區(qū)中。
      無用單元收集器可對包括在堆中的存儲(chǔ)區(qū)進(jìn)行無用單元收集。 根據(jù)本發(fā)明的另 一方面,提供一種具有用于上述方法的計(jì)算機(jī)程序的計(jì) 算機(jī)可讀介質(zhì)。


      通過參照附圖對本發(fā)明示例性實(shí)施例進(jìn)行詳細(xì)描述,本發(fā)明的上述和其 他方面將變得更明顯,其中
      圖1是解釋現(xiàn)有技術(shù)的管理內(nèi)存的設(shè)備的框圖2示出由實(shí)時(shí)線程引用存儲(chǔ)區(qū)的現(xiàn)有^f支術(shù)的方法;
      圖3是解釋根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備的框圖5是示出根據(jù)本發(fā)明示例性實(shí)施例的進(jìn)行無用單元收集的方法的流程
      圖6A和圖6B是解釋根據(jù)本發(fā)明示例性實(shí)施例的使存儲(chǔ)區(qū)緊湊的方法的
      框圖7是解釋根據(jù)本發(fā)明另一示例性實(shí)施例的進(jìn)行無用單元收集的方法的 流程圖8示出根據(jù)本發(fā)明示例性實(shí)施例的異常處理的示例。
      具體實(shí)施例方式
      以下,將參照附圖更全面地描述本發(fā)明,在附圖中示出了本發(fā)明的示例 性實(shí)施例。
      圖3是解釋根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備的框圖。 根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備包括調(diào)度器31、堆32和無 用單元收集器33。
      參照圖3,與圖1的現(xiàn)有技術(shù)的搶占實(shí)時(shí)調(diào)度器ll相似,根據(jù)本發(fā)明示 例性實(shí)施例的調(diào)度器31調(diào)整線程之間的優(yōu)先級,以將實(shí)時(shí)線程35調(diào)度為優(yōu) 先于普通線程36運(yùn)行。
      此外,調(diào)度器31對無用單元收集器33產(chǎn)生中斷,以便在所有實(shí)時(shí)線程 35的運(yùn)行結(jié)束之后進(jìn)行無用單元收集。如果還沒有進(jìn)行無用單元收集,則對 無用單元收集進(jìn)行調(diào)度,以在所有實(shí)時(shí)線程35的運(yùn)行結(jié)束之后進(jìn)行無用單元 收集,其中,實(shí)時(shí)線程35當(dāng)前正在運(yùn)行或?qū)⒁\(yùn)行。如果在正在進(jìn)行無用單 元收集時(shí)發(fā)生運(yùn)行實(shí)時(shí)線程35的嘗試,則對無用單元收集器33產(chǎn)生中斷, 以便在該實(shí)時(shí)線程35先結(jié)束之后再進(jìn)行無用單元收集。
      由于調(diào)度器31調(diào)整線程之間的優(yōu)先級,并對實(shí)時(shí)線程進(jìn)行調(diào)度,以使實(shí) 時(shí)線程的運(yùn)行不被無用單元收集所阻止,因此可沒有延遲地確保實(shí)時(shí)線程35 的運(yùn)行。
      與圖1的現(xiàn)有技術(shù)的堆13相似,根據(jù)本發(fā)明示例性實(shí)施例的堆32存儲(chǔ) 運(yùn)行普通線程36所需的對象。預(yù)定的程序運(yùn)行,同時(shí)由Java虛擬才幾來分配 堆13。
      此外,堆32包括為了運(yùn)行實(shí)時(shí)線程35而由用戶設(shè)置的多個(gè)存儲(chǔ)區(qū)321。 根據(jù)傳統(tǒng)的Java實(shí)時(shí)規(guī)范,當(dāng)運(yùn)行實(shí)時(shí)線程15時(shí),獨(dú)立于堆13設(shè)置存儲(chǔ)區(qū) 14,運(yùn)行線程所需的對象被存儲(chǔ)在存儲(chǔ)區(qū)14中以被訪問。然而,根據(jù)本發(fā)明 示例性實(shí)施例,當(dāng)實(shí)時(shí)線程35運(yùn)行時(shí),存儲(chǔ)區(qū)321 #皮-沒置在堆32中,而非 堆32之外。
      存儲(chǔ)區(qū)321被設(shè)置在堆32中,并且設(shè)置的存儲(chǔ)區(qū)321由無用單元收集器 33 (將在隨后描述)管理。為了防止虛引用,運(yùn)行普通線程36所需的對象和 運(yùn)行實(shí)時(shí)線程35所需的對象都被存儲(chǔ)在堆32中,并由無用單元收集器33進(jìn)
      行管理。
      與圖1的現(xiàn)有技術(shù)的無用單元收集器12相似,根據(jù)本發(fā)明示例性實(shí)施例 的無用單元收集器33對堆32中存在的對象進(jìn)行無用單元收集。無用單元收 集器33確定存儲(chǔ)在堆32中的對象是否被使用。沒有被使用的對象從內(nèi)存中 被去除,并使剩余的對象緊湊。
      此外,無用單元收集器33對包括在堆32中的存儲(chǔ)區(qū)321進(jìn)行無用單元 收集。稍后將詳細(xì)描述由無用單元收集器33進(jìn)行無用單元收集的方法。
      圖4是示出根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的方法的流程圖。
      參照圖4,在操作400,根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備對無 用單元收集進(jìn)行調(diào)度,以便在實(shí)時(shí)線程35的運(yùn)行結(jié)束之后進(jìn)行無用單元收 集。
      如果還沒有進(jìn)行無用單元收集,則對無用單元收集進(jìn)行調(diào)度,以便在實(shí)
      時(shí)線程35的運(yùn)行結(jié)束之后進(jìn)行無用單元收集,其中,實(shí)時(shí)線程35當(dāng)前正運(yùn) 行或?qū)⒁\(yùn)行。如果在正在進(jìn)行無用單元收集時(shí)試圖運(yùn)行實(shí)時(shí)線程,則產(chǎn)生 中斷,以在實(shí)時(shí)線程先運(yùn)行之后再進(jìn)行無用單元收集。
      在操作410,根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備根據(jù)先前在操 作400中設(shè)置的調(diào)度來進(jìn)行無用單元收集。這將參照圖5至圖7更全面地進(jìn) 行描述。
      g。; '、、、,、、
      參照圖5,在操作500,根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備刪除 存儲(chǔ)在預(yù)定的存儲(chǔ)區(qū)中的對象中的沒有被使用的對象。在Java實(shí)時(shí)規(guī)范中, 僅對運(yùn)行普通線程16所需的對象進(jìn)行無用單元收集,其中,普通線程16被 存儲(chǔ)在堆13中。
      然而,根據(jù)本發(fā)明示例性實(shí)施例,為運(yùn)行實(shí)時(shí)線程35而分配的存儲(chǔ)區(qū) 321也被包括在堆32中,因此對包括在堆32中的存儲(chǔ)區(qū)321進(jìn)行無用單元收集。
      為了進(jìn)行無用單元收集,根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備首 先刪除存儲(chǔ)在存儲(chǔ)區(qū)中的對象中的沒有被使用的對象。為運(yùn)行實(shí)時(shí)線程35而 分配的存儲(chǔ)區(qū)321的大小由程序員在其設(shè)計(jì)程序時(shí)進(jìn)行設(shè)置。如果程序員沒 有充分設(shè)置存儲(chǔ)區(qū)321的大小,則當(dāng)存儲(chǔ)區(qū)321完全滿時(shí),實(shí)時(shí)線程35可能 不能夠?qū)ο蟠鎯?chǔ)在存儲(chǔ)區(qū)321中。由于通過線程創(chuàng)建新的存儲(chǔ)區(qū)321并分 配對象的時(shí)間被延遲,所以通過刪除沒有被使用的對象來確保用于將對象存 儲(chǔ)在存儲(chǔ)區(qū)321中的備用空間。
      在操作510,根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備使存儲(chǔ)區(qū)321 中的沒有被刪除的對象緊湊?;谧詈蟠鎯?chǔ)在存儲(chǔ)區(qū)中的對象來設(shè)置指向存 儲(chǔ)區(qū)321中的備用空間的分配指針,因此從存儲(chǔ)區(qū)的開始部分起連續(xù)存儲(chǔ)對 象,以便不留空閑空間。
      圖6A和圖6B是解釋根據(jù)本發(fā)明示例性實(shí)施例的使存儲(chǔ)區(qū)321緊湊的方 法的框圖。
      參照圖6A,線程A引用存儲(chǔ)區(qū)1,存儲(chǔ)區(qū)1包括對象1、 2、 3、 4、 5 等。這里,假設(shè)對象2和4是不再使用的對象。在操作500,根據(jù)本發(fā)明的管理內(nèi)存的設(shè)備刪除存儲(chǔ)區(qū)1中的沒有被使
      用的對象。當(dāng)包括在存儲(chǔ)區(qū)1中的對象沒有被其他對象引用時(shí),這些對象被
      確定為不再使用的對象,并從存儲(chǔ)區(qū)中被刪除。在圖6A中,對象2和4沒
      有被使用,因此,從存儲(chǔ)區(qū)1中刪除這些對象。
      用于使存儲(chǔ)區(qū)中的剩余對象緊湊的操作510包括操作511和512。 在操作511 ,管理內(nèi)存的設(shè)備將剩余對象復(fù)制到堆32中的臨時(shí)緩沖器中。 在操作512,管理內(nèi)存的設(shè)備從存儲(chǔ)區(qū)的開始部分開始將復(fù)制到臨時(shí)緩
      沖器中的對象連續(xù)存儲(chǔ)在存儲(chǔ)區(qū)中,以便不留空閑空間。圖6B示出完成緊湊
      處理時(shí)的存儲(chǔ)區(qū)1。
      圖7是解釋根據(jù)本發(fā)明另一示例性實(shí)施例的進(jìn)行無用單元收集的方法的
      流程圖。
      在操作700,根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備確定是否存在 引用存儲(chǔ)區(qū)的線程。
      存儲(chǔ)區(qū)321是為運(yùn)行實(shí)時(shí)線程35而分配的,并且被具有圖2中所示的棧 結(jié)構(gòu)的存儲(chǔ)區(qū)棧所連續(xù)引用。 一個(gè)存儲(chǔ)區(qū)可被多個(gè)線程引用。在Java實(shí)時(shí)規(guī) 范中,由Java虛擬機(jī)提供識別引用預(yù)定存儲(chǔ)區(qū)的線程的數(shù)量的方法。
      Java實(shí)時(shí)規(guī)范中的線程引用計(jì)數(shù)器識別引用預(yù)定存儲(chǔ)區(qū)的線程的數(shù)量, 并且當(dāng)發(fā)現(xiàn)所述數(shù)量改變時(shí),線程可1用計(jì)數(shù)器反映所述改變。
      如果根據(jù)在操作700中確定的結(jié)果,仍存在引用預(yù)定存儲(chǔ)區(qū)的線程,則 不能刪除該存儲(chǔ)區(qū),因此通過操作701和702對存儲(chǔ)區(qū)321進(jìn)行無用單元收 集。操作701和702分別與操作500和510相同。
      每當(dāng)引用存儲(chǔ)區(qū)321的線程的數(shù)量一個(gè)接一個(gè)地減少時(shí),進(jìn)行無用單元 收集以立即去除沒有被使用的對象。
      如果在操作700中確定不存在引用預(yù)定存儲(chǔ)區(qū)的線程,則執(zhí)行操作710 至720以去除存^t區(qū)321。
      在操作710,根據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備確定在存儲(chǔ)區(qū)
      321中是否存在仍被使用的對象。即使引用存儲(chǔ)區(qū)321的線程全部結(jié)束,包
      括在將被刪除的存儲(chǔ)區(qū)321中的每一對象仍可能被存儲(chǔ)區(qū)321之外的其他對
      象所引用。所述存儲(chǔ)區(qū)321之外的其他對象可存儲(chǔ)在用于普通線程36的堆
      32中,或存儲(chǔ)在其他存儲(chǔ)區(qū)321中。
      Java實(shí)時(shí)規(guī)范的線程引用計(jì)數(shù)器僅計(jì)算引用存儲(chǔ)區(qū)14的線程的數(shù)量,從
      而線程引用計(jì)數(shù)器不能計(jì)算包括在存儲(chǔ)區(qū)14中的對象被存儲(chǔ)區(qū)14之外的其 他對象引用的次數(shù)。因此,即使線程引用計(jì)數(shù)器指出不存在引用該存儲(chǔ)區(qū)的
      線程,包括在存儲(chǔ)區(qū)14中的對象也可能被存儲(chǔ)區(qū)14之外的其他對象所引用。 因此,如果存儲(chǔ)區(qū)14被刪除,則引用的對象丟失,從而發(fā)生虛引用。為了防 止該問題,執(zhí)行操作711。
      用的對象的所有引用,或者將使用的對象復(fù)制到堆32的其他部分中或其他存
      儲(chǔ)區(qū)321中。虛引用可能引起嚴(yán)重的錯(cuò)誤,因此仍被使用的對象及相關(guān)引用
      全部被去除,或被復(fù)制到內(nèi)存的另一部分。這里,內(nèi)存的其他部分可以是另
      一存儲(chǔ)區(qū)或?yàn)槠胀ň€程分配的堆32的另一部分。
      如果發(fā)生虛引用,則應(yīng)當(dāng)通知程序員。然后,根據(jù)程序員的決定,去除
      引用或者復(fù)制對象。在Java中,在運(yùn)行程序期間發(fā)生錯(cuò)誤時(shí),產(chǎn)生異常 (exception)以通知程序員。此外,在產(chǎn)生關(guān)于包括在存儲(chǔ)區(qū)321中的對象
      的虛引用的情況下,利用所述異常來通知程序員。
      圖8示出根據(jù)本發(fā)明示例性實(shí)施例的異常處理的示例。
      參照圖8,如上所示,如果在存儲(chǔ)區(qū)321被刪除時(shí),仍存在被使用的對
      象,則Java虛擬機(jī)產(chǎn)生異常,并利用例如圖8中所示的指令來去除與該對象
      相關(guān)的引用。
      在圖8中,當(dāng)標(biāo)題為"logic 1"的線程的運(yùn)行結(jié)束時(shí),標(biāo)題為 "myMemoryArea"的存儲(chǔ)區(qū)被刪除,對于存在的被使用的對象,產(chǎn)生標(biāo)題為 "UnclaimedReferenceException', 的異常。
      當(dāng)異常產(chǎn)生時(shí),通過"getUnclaimedReferences"獲得仍被使用的對象以 及所有相關(guān)引用的信息,并且所述引用全部被去除。
      在圖8中,通過在刪除存儲(chǔ)區(qū)時(shí)去除與使用的對象相關(guān)的所有引用,防 止了虛引用??蛇x地,通過將所述對象復(fù)制到內(nèi)存的其他部分中以被繼續(xù)使 用,防止了虛引用。
      當(dāng)在操作711中,完成了對仍被使用的對象的處理時(shí),在操作720,根 據(jù)本發(fā)明示例性實(shí)施例的管理內(nèi)存的設(shè)備刪除沒有被線程引用的存儲(chǔ)區(qū)。
      根據(jù)本發(fā)明示例性實(shí)施例,在實(shí)時(shí)線程35的運(yùn)行結(jié)束之后進(jìn)行無用單元 收集,以使得實(shí)時(shí)線程35的運(yùn)行不被無用單元收集所延遲,從而確保了實(shí)時(shí) 線程35的運(yùn)行。
      此外,為運(yùn)行實(shí)時(shí)線程35而分配的存儲(chǔ)區(qū)321在堆32中被管理,因此 可防止虛引用,從而確保線程運(yùn)行的安全。
      盡管已參照本發(fā)明的示例性實(shí)施例具體地顯示和描述了本發(fā)明,但是本 領(lǐng)域普通技術(shù)人員應(yīng)該理解,在不脫離由權(quán)利要求限定的本發(fā)明的范圍和精 神的情況下,可進(jìn)行各種形式和細(xì)節(jié)上的改變。此外,本發(fā)明的系統(tǒng)可被實(shí) 現(xiàn)為計(jì)算機(jī)可讀記錄介質(zhì)上的計(jì)算機(jī)可讀代碼。計(jì)算機(jī)可讀記錄介質(zhì)可以是 可存儲(chǔ)隨后可由計(jì)算機(jī)系統(tǒng)讀取的數(shù)據(jù)的任何數(shù)據(jù)存儲(chǔ)裝置。計(jì)算機(jī)可讀記 錄介質(zhì)的例子包括只讀存儲(chǔ)器(ROM )、隨機(jī)存取存儲(chǔ)器(RAM )、壓縮盤(CD ) -ROM、 ^磁帶、軟盤和光學(xué)數(shù)據(jù)存儲(chǔ)裝置。計(jì)算機(jī)可讀記錄介質(zhì)還可在聯(lián)網(wǎng)的 計(jì)算機(jī)系統(tǒng)上分布,從而計(jì)算機(jī)可讀代碼可以以分布式方式被存儲(chǔ)和執(zhí)行。
      權(quán)利要求
      1、一種管理內(nèi)存的方法,該方法包括對無用單元收集進(jìn)行調(diào)度,以在實(shí)時(shí)線程的運(yùn)行結(jié)束之后對內(nèi)存中的堆進(jìn)行無用單元收集;根據(jù)所述調(diào)度對所述堆進(jìn)行無用單元收集。
      2、 如權(quán)利要求l所述的方法,其中,進(jìn)行無用單元收集的步驟包括根 據(jù)Java實(shí)時(shí)規(guī)范來進(jìn)行無用單元收集。
      3、 如權(quán)利要求l所述的方法,其中,所述堆包括存儲(chǔ)區(qū),用于運(yùn)行實(shí)時(shí) 線程的對象存儲(chǔ)在所述存儲(chǔ)區(qū)中。
      4、 如權(quán)利要求3所述的方法,其中,進(jìn)行無用單元收集的步驟包括對 所述存儲(chǔ)區(qū)進(jìn)行無用單元收集。
      5、 如權(quán)利要求4所述的方法,其中,進(jìn)行無用單元收集的步驟包括 刪除存儲(chǔ)在所述存儲(chǔ)區(qū)中的對象中的沒有被使用的對象; 在所述存儲(chǔ)區(qū)中使沒有通過刪除對象的步驟被刪除的對象緊湊。
      6、 如權(quán)利要求4所述的方法,其中,進(jìn)行無用單元收集的步驟包括 確定是否存在? 1用所述存儲(chǔ)區(qū)的線程;根據(jù)確定的結(jié)果,有選擇地刪除該存儲(chǔ)區(qū)。
      7、 如權(quán)利要求6所述的方法,其中,刪除存儲(chǔ)區(qū)的步驟包括 如果確定不存在? 1用該存儲(chǔ)區(qū)的線程,則確定該存儲(chǔ)區(qū)中是否存在使用的對象;去除對所述使用的對象的引用,或者將所述使用的對象復(fù)制到堆的另一 部分或另一存儲(chǔ)區(qū)中; 刪除該存儲(chǔ)區(qū)。
      8、 一種管理內(nèi)存的設(shè)備,該設(shè)備包括調(diào)度器,對無用單元收集進(jìn)行調(diào)度,以在實(shí)時(shí)線程的運(yùn)行結(jié)束之后對內(nèi) 存中的堆進(jìn)行無用單元收集;無用單元收集器,根據(jù)所述調(diào)度對所述堆進(jìn)行無用單元收集。
      9、 如權(quán)利要求8所述的設(shè)備,其中,無用單元收集器根據(jù)Java實(shí)時(shí)規(guī) 范來進(jìn)行無用單元收集。
      10、 如權(quán)利要求8所述的設(shè)備,其中,所述堆包括存儲(chǔ)區(qū),用于運(yùn)行實(shí)時(shí)線程的對象存儲(chǔ)在所述存儲(chǔ)區(qū)中。
      11、 如權(quán)利要求IO所述的設(shè)備,其中,無用單元收集器對所述存儲(chǔ)區(qū)進(jìn) 行無用單元收集。
      12、 如權(quán)利要求11所述的設(shè)備,其中,無用單元收集器刪除存儲(chǔ)在所述存儲(chǔ)區(qū)中的對象中的沒有被使用的對象,并在沒有被使用的對象被刪除之后 使沒有被刪除的對象緊湊。
      13、 如權(quán)利要求11所述的設(shè)備,其中,無用單元收集器確定是否存在引 用所述存儲(chǔ)區(qū)的線程,并且根據(jù)確定的結(jié)果,有選擇地刪除該存儲(chǔ)區(qū)。
      14 、 一種具有用于執(zhí)行管理內(nèi)存的方法的計(jì)算機(jī)程序的計(jì)算機(jī)可讀介質(zhì), 所述方法包括對無用單元收集進(jìn)行調(diào)度,以在實(shí)時(shí)線程的運(yùn)行結(jié)束之后對內(nèi)存中的堆 進(jìn)行無用單元收集;根據(jù)所述調(diào)度對所述堆進(jìn)行無用單元收集。
      15、 如權(quán)利要求14所述的計(jì)算機(jī)可讀介質(zhì),其中,進(jìn)行無用單元收集的 步驟包括根據(jù)Java實(shí)時(shí)規(guī)范來進(jìn)行無用單元收集。
      16、 如權(quán)利要求14所述的計(jì)算機(jī)可讀介質(zhì),其中,所述堆包括存儲(chǔ)區(qū), 用于運(yùn)行實(shí)時(shí)線程的對象存儲(chǔ)在所述存儲(chǔ)區(qū)中。
      17、 如權(quán)利要求16所述的計(jì)算機(jī)可讀介質(zhì),其中,進(jìn)行無用單元收集的 步驟包括對所述存儲(chǔ)區(qū)進(jìn)行無用單元收集。
      18、 如權(quán)利要求17所述的計(jì)算機(jī)可讀介質(zhì),其中,進(jìn)行無用單元收集的 步驟包括刪除存儲(chǔ)在所述存儲(chǔ)區(qū)中的對象中的沒有被使用的對象; 在所述存儲(chǔ)區(qū)中使沒有通過刪除對象的步驟被刪除的對象緊湊。
      19、 如權(quán)利要求17所述的計(jì)算機(jī)可讀介質(zhì),其中,進(jìn)行無用單元收集的 步驟包括確定是否存在引用所述存儲(chǔ)區(qū)的線程; 根據(jù)確定的結(jié)果,有選擇地刪除該存儲(chǔ)區(qū)。
      20、 如權(quán)利要求19所述的計(jì)算機(jī)可讀介質(zhì),其中,刪除存儲(chǔ)區(qū)的步驟包括..如果確定不存在^ 1用該存儲(chǔ)區(qū)的線程,則確定該存儲(chǔ)區(qū)中是否存在使用 的對象;去除對使用的對象的引用,或者將所述使用的對象復(fù)制到堆的另一部分 或另一存儲(chǔ)區(qū)中;刪除該存儲(chǔ)區(qū)。
      全文摘要
      提供一種管理內(nèi)存的方法和設(shè)備。所述方法包括對無用單元收集進(jìn)行調(diào)度,以在實(shí)時(shí)線程的運(yùn)行結(jié)束之后對內(nèi)存中的預(yù)定堆進(jìn)行無用單元收集;根據(jù)所述調(diào)度進(jìn)行無用單元收集。由于為運(yùn)行實(shí)時(shí)線程而分配的存儲(chǔ)區(qū)在堆中被管理,所以可防止產(chǎn)生虛引用,從而確保線程運(yùn)行的安全。
      文檔編號G06F9/46GK101169739SQ20071010771
      公開日2008年4月30日 申請日期2007年4月28日 優(yōu)先權(quán)日2006年10月27日
      發(fā)明者權(quán)子根 申請人:三星電子株式會(huì)社
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
      1