欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

調(diào)度虛擬機(jī)的垃圾收集的方法、裝置和集群系統(tǒng)的制作方法

文檔序號(hào):6468226閱讀:167來源:國(guó)知局
專利名稱:調(diào)度虛擬機(jī)的垃圾收集的方法、裝置和集群系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明總體上涉及協(xié)調(diào)集群環(huán)境中多個(gè)應(yīng)用之間的垃圾收集的方法和裝置,更具
體地涉及主動(dòng)調(diào)度集群環(huán)境中多個(gè)應(yīng)用內(nèi)的垃圾收集時(shí)間的方法和裝置。
背景技術(shù)
垃圾收集(Garbage Collection, GC)機(jī)制是諸如Java、 C#、 Python、 Eiffel、 Roby 等的新一代語言共有的特征。通過這種垃圾收集機(jī)制,可以自動(dòng)管理對(duì)內(nèi)存的回收,而無需 程序員通過調(diào)用函數(shù)來釋放內(nèi)存,因而減輕了程序員的編程負(fù)擔(dān)。 目前,在諸如電信業(yè)務(wù)的大型應(yīng)用中廣泛地采用集群架構(gòu)的應(yīng)用服務(wù)器,如基于 Java、C#的應(yīng)用服務(wù)器等。例如,Java語言具有易于學(xué)習(xí)和編寫、獨(dú)立于操作系統(tǒng)等優(yōu)點(diǎn), 當(dāng)前大部分應(yīng)用服務(wù)器是以基于Java的架構(gòu)來支持基于Java的業(yè)務(wù),諸如IBM公司的 Websphere Application Server。 對(duì)諸如電信業(yè)務(wù)的實(shí)時(shí)應(yīng)用的開發(fā)最重要的要求就是良好的實(shí)時(shí)處理性能,因而 對(duì)部分運(yùn)行時(shí)行為強(qiáng)加了時(shí)間限制。此類限制通常是對(duì)應(yīng)用程序的某些部分實(shí)施的,比如 中斷處理程序,其響應(yīng)中斷的代碼必須在給定的時(shí)間范圍內(nèi)完成工作。應(yīng)用服務(wù)器中間件 運(yùn)行在設(shè)置有GC機(jī)制的虛擬機(jī)上。GC機(jī)制雖然簡(jiǎn)化了開發(fā),但同時(shí)也帶來了一定量的系統(tǒng) 開銷。虛擬機(jī)在進(jìn)行垃圾收集時(shí),會(huì)暫停一切運(yùn)算處理,這種現(xiàn)象也被稱為"世界暫停(Stop The World, STW)",而且這種"世界暫停"的頻率和時(shí)長(zhǎng)都不確定。這種現(xiàn)象會(huì)導(dǎo)致對(duì)用戶 請(qǐng)求的響應(yīng)時(shí)間增長(zhǎng),對(duì)于電信應(yīng)用等的實(shí)時(shí)性要求高的應(yīng)用來說,有時(shí)會(huì)是無法接受的。
為了解決這禾中"世界暫停,,的問題,David F. Bacon、 Perry Cheng、禾口 V. T. Rajan 提出了針對(duì)Java應(yīng)用的Metronome算法("A Real-timeGarbage Collector with Low Overhead and Consistent Utilization", Conference Record of the Thirtieth ACM Symposium on Principles ofProgramming Languages(New Orleans, Louisiana,January 2003) , pp. 285-298)。在Metronome算法中,將一次GC處理細(xì)分為在多個(gè)不連續(xù)的小時(shí)間 段內(nèi)執(zhí)行,從而縮短了每次"世界暫停"的時(shí)間。然而,這種GC方法降低了內(nèi)存利用率和服 務(wù)器的服務(wù)能力。 如上所述,現(xiàn)在的電信應(yīng)用基本上都采用集群架構(gòu),其中包括多個(gè)虛擬機(jī)。在集群 環(huán)境中,解決"世界暫停"問題的一種方法是將正在進(jìn)行GC的虛擬機(jī)的業(yè)務(wù)請(qǐng)求切換到集 群中未發(fā)生GC的虛擬機(jī)。 以由Java虛擬機(jī)(Java Virtual Machine, JVM)構(gòu)成的集群環(huán)境為例,發(fā)明人發(fā) 現(xiàn),這種集群環(huán)境中的虛擬機(jī)的配置往往近似,因而會(huì)出現(xiàn)集群內(nèi)的多個(gè)虛擬機(jī)趨于幾乎 同步地發(fā)生GC處理的情形。這種情形可由圖l例示。 圖1例示了在總共有4臺(tái)Java虛擬機(jī)的Java虛擬機(jī)集群系統(tǒng)示例中,每臺(tái)Java 虛擬機(jī)的內(nèi)存使用情況隨時(shí)間的變化。由圖1可見,集群系統(tǒng)中的4臺(tái)Java虛擬機(jī)隨著時(shí) 間的推進(jìn)而趨于同步地進(jìn)行GC。當(dāng)集群內(nèi)所有Java虛擬機(jī)幾乎同步發(fā)生GC時(shí),會(huì)導(dǎo)致無 法處理普通的業(yè)務(wù)請(qǐng)求,我們稱這種情形為"無處可逃(no place to hide)"。一旦出現(xiàn)"無處可逃",就會(huì)嚴(yán)重影響整個(gè)集群系統(tǒng)的實(shí)時(shí)性能??梢詷?gòu)想,這種同步GC的現(xiàn)象會(huì)出現(xiàn)在 所有基于具有GC機(jī)制的應(yīng)用所構(gòu)成的集群環(huán)境中,例如,支持大型應(yīng)用的Cft集群環(huán)境。本 發(fā)明人相信,隨著新一代具有垃圾收集機(jī)制的語言在集群環(huán)境中的廣泛應(yīng)用,上述同步垃 圾收集的問題將會(huì)變得日益突出。 因此,希望提供一種能夠調(diào)度集群環(huán)境中多個(gè)虛擬機(jī)之間的垃圾收集的方法和裝置。

發(fā)明內(nèi)容
本發(fā)明的一個(gè)目的在于提供一種能夠調(diào)度虛擬機(jī)的垃圾收集的方法、裝置和集群 系統(tǒng),其有效地解決了上述同步GC的問題。 本發(fā)明通過主動(dòng)控制集群環(huán)境中各個(gè)虛擬機(jī)發(fā)生GC的時(shí)機(jī)來協(xié)調(diào)這些虛擬機(jī)的 GC時(shí)亥lj,從而避免在被動(dòng)GC情況下出現(xiàn)的上述同步GC問題。 在本文中,將虛擬機(jī)中由于內(nèi)存消耗達(dá)到一最大值而自動(dòng)觸發(fā)的GC稱為"被動(dòng) GC"或"自動(dòng)GC",而將通過本發(fā)明的方法和裝置主動(dòng)引入到虛擬機(jī)中的GC稱為"主動(dòng)GC"。
在本發(fā)明的第一方面中,提供了一種用于控制集群環(huán)境中多個(gè)虛擬機(jī)內(nèi)的垃圾收 集的調(diào)度的方法,包括接收來自所述多個(gè)虛擬機(jī)中的內(nèi)存使用報(bào)告;以及基于接收到的 所述內(nèi)存使用報(bào)告,調(diào)度所述多個(gè)虛擬機(jī)內(nèi)的垃圾收集。 在本發(fā)明的第二方面中,提供了一種用于集群環(huán)境下多個(gè)虛擬機(jī)的垃圾收集調(diào)度 器,該垃圾收集調(diào)度器接收來自所述多個(gè)虛擬機(jī)的內(nèi)存使用報(bào)告,并根據(jù)該內(nèi)存使用報(bào)告 來調(diào)度所述多個(gè)虛擬機(jī)內(nèi)的垃圾收集。 在本發(fā)明的第三方面中,提供了一種集群系統(tǒng),包括多個(gè)虛擬機(jī),其各自具有用 于發(fā)送垃圾收集報(bào)告和內(nèi)存使用報(bào)告的報(bào)告裝置;調(diào)度確定器,其基于來自所述多個(gè)報(bào)告 裝置的垃圾收集報(bào)告或者是否經(jīng)過了預(yù)定時(shí)段,來確定是否要進(jìn)行垃圾收集調(diào)度;和垃圾 收集調(diào)度器,在所述調(diào)度確定器確定要進(jìn)行垃圾收集調(diào)度時(shí),該垃圾收集調(diào)度器接收來自 所述多個(gè)報(bào)告裝置的內(nèi)存使用報(bào)告,并基于該內(nèi)存使用報(bào)告來調(diào)度該集群系統(tǒng)中的所述多 個(gè)虛擬機(jī)內(nèi)的垃圾收集。 本發(fā)明通過主動(dòng)調(diào)度集群環(huán)境中多個(gè)虛擬機(jī)內(nèi)的垃圾收集,進(jìn)行協(xié)調(diào)以使得避免 出現(xiàn)多個(gè)虛擬機(jī)的同步垃圾收集。 利用本發(fā)明的方法和裝置,避免了多個(gè)虛擬機(jī)之間出現(xiàn)同步垃圾收集,從而提高 了集群系統(tǒng)的實(shí)時(shí)性能,同時(shí)基本上不會(huì)降低內(nèi)存利用率。


根據(jù)以下參照附圖對(duì)本發(fā)明示例性實(shí)施方式的詳細(xì)描述,將更好地理解以上和其 他示例目的、方面和優(yōu)點(diǎn)。 圖1是例示出多個(gè)Java虛擬機(jī)之間發(fā)生同步垃圾收集的實(shí)例的曲線圖;
圖2是示出了根據(jù)本發(fā)明實(shí)施例的垃圾收集調(diào)度控制方法的流程圖;
圖3是示出了根據(jù)本發(fā)明實(shí)施例的計(jì)算各Java虛擬機(jī)的目標(biāo)內(nèi)存使用值的處理 的流程圖; 圖4A和圖4B是示出了根據(jù)本發(fā)明實(shí)施例的Java虛擬機(jī)內(nèi)處理的流程 圖5是示出在圖1所示的Java虛擬機(jī)集群結(jié)構(gòu)實(shí)例中,應(yīng)用了本發(fā)明的方法之后 的內(nèi)存使用和垃圾收集調(diào)度情況的圖表; 圖6以曲線圖的形式示出了圖5中4臺(tái)Java虛擬機(jī)的內(nèi)存使用值隨時(shí)間的變化;
圖7是示出了根據(jù)本發(fā)明實(shí)施例的具有垃圾收集調(diào)度功能的集群系統(tǒng)的框圖;和
圖8是示出了根據(jù)本發(fā)明實(shí)施例的垃圾收集調(diào)度器的框圖。
具體實(shí)施例方式
應(yīng)當(dāng)理解,本發(fā)明的附圖和描述已經(jīng)簡(jiǎn)化,以例示有助于清楚地理解本發(fā)明的步 驟或部件,同時(shí)出于清楚的目的,除去了典型的軟件分析技術(shù)中的其他步驟或部件。本領(lǐng)域 技術(shù)人員將認(rèn)識(shí)到,為了實(shí)施本發(fā)明,其他步驟或部件是希望的和/或是必需的。然而,由 于這些步驟或部件是本領(lǐng)域所公知的,并且由于它們并不助于更好地理解本發(fā)明,所以本 文中并未給出關(guān)于它們的描述。還應(yīng)當(dāng)理解,本文所包括的附圖僅僅給出了對(duì)于本發(fā)明的 當(dāng)前實(shí)施例的圖形表示,落入本發(fā)明的范圍內(nèi)的步驟或部件可包括不同于這些附圖中示出 的步驟或部件。下面將引用附圖,其中對(duì)類似的步驟或部件給予類似的附圖標(biāo)記。
如上所述,同步垃圾收集可能是應(yīng)用到集群環(huán)境中的具有垃圾收集機(jī)制的語言將 共同面臨的問題。出于清楚地例示本發(fā)明的目的,下文中將具體地以Java應(yīng)用為例來詳細(xì) 說明本發(fā)明的實(shí)施例。圖2示出了應(yīng)用于具有n(n為正整數(shù))個(gè)Java虛擬機(jī)的集群系統(tǒng) 的根據(jù)本發(fā)明的垃圾收集調(diào)度控制方法的流程圖。首先,在步驟202處,從集群環(huán)境中的n 個(gè)Java虛擬機(jī)接收垃圾收集報(bào)告,該垃圾收集報(bào)告中包含垃圾收集類型(即,主動(dòng)垃圾收 集或被動(dòng)垃圾收集)、垃圾收集發(fā)生時(shí)刻、垃圾收集執(zhí)行時(shí)長(zhǎng)、觸發(fā)垃圾收集時(shí)的內(nèi)存使用 值以及垃圾收集后的內(nèi)存使用值等相關(guān)信息。接著,在步驟204處,例如基于在步驟202處 接收到的垃圾收集報(bào)告,按照預(yù)定準(zhǔn)則判斷是否出現(xiàn)了預(yù)定數(shù)量m(m為小于或等于n的正 整數(shù))個(gè)Java虛擬機(jī)發(fā)生同步垃圾收集的趨勢(shì),從而確定是否要對(duì)該集群系統(tǒng)中Java虛 擬機(jī)的垃圾收集進(jìn)行調(diào)度。該預(yù)定數(shù)量m可以是根據(jù)系統(tǒng)性能的總體要求確定的。例如, 集群系統(tǒng)中總共有n = 7臺(tái)虛擬機(jī),如果其中3臺(tái)幾乎同時(shí)進(jìn)行垃圾收集就會(huì)導(dǎo)致無法滿 足應(yīng)用要求,則可將該預(yù)定數(shù)量m設(shè)置為3。當(dāng)然,該預(yù)定數(shù)量m也可以設(shè)為等于集群系統(tǒng) 中的Java虛擬機(jī)總數(shù)n。 上述預(yù)定準(zhǔn)則例如可以是計(jì)算集群環(huán)境中各Java虛擬機(jī)之間依次發(fā)生垃圾收集 的時(shí)間間隔,并且當(dāng)這些時(shí)間間隔中的m個(gè)時(shí)間間隔值小于或等于一預(yù)定時(shí)間間隔值時(shí), 判定出現(xiàn)同步垃圾收集的趨勢(shì)。其中所述預(yù)定時(shí)間間隔值可以是根據(jù)集群環(huán)境架構(gòu)、對(duì)提 供業(yè)務(wù)的要求等因素來設(shè)置的,也可以采取實(shí)際經(jīng)驗(yàn)值。上述將各Java虛擬機(jī)間的垃圾收 集時(shí)間間隔與一預(yù)定時(shí)間間隔值進(jìn)行比較的方法僅僅是示例性的,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理 解,任何其他適合的判斷準(zhǔn)則都是可行的。另外,在上述實(shí)施例中,在步驟204中是通過檢
測(cè)到同步垃圾收集趨勢(shì)而啟動(dòng)本發(fā)明的垃圾收集調(diào)度控制,但是本發(fā)明的調(diào)度方法也可以 是定期來執(zhí)行的。例如,根據(jù)系統(tǒng)實(shí)際情況,例如通過考察該集群系統(tǒng)中多個(gè)Java虛擬機(jī) 出現(xiàn)同步趨勢(shì)的平均周期,來設(shè)定一預(yù)定時(shí)段,在步驟204中通過監(jiān)控距離上次垃圾收集 調(diào)度是否經(jīng)過了該預(yù)定時(shí)段,從而確定是否要進(jìn)行垃圾收集調(diào)度。 如果在步驟204處確定不執(zhí)行垃圾收集調(diào)度,則返回到步驟202,繼續(xù)接收垃圾收 集報(bào)告。而如果在步驟204處確定要執(zhí)行調(diào)度,則啟動(dòng)圖2中虛線框中示出的本發(fā)明的垃圾收集調(diào)度控制方法,實(shí)施主動(dòng)垃圾收集干預(yù)。具體地,在步驟206處,從集群環(huán)境中的n個(gè)Java虛擬機(jī)接收內(nèi)存使用報(bào)告,該內(nèi)存使用報(bào)告包含Java虛擬機(jī)的當(dāng)前內(nèi)存使用值。接下來,從步驟208起到步驟322,基于接收到的該內(nèi)存使用報(bào)告,具體地執(zhí)行對(duì)集群環(huán)境中各Java虛擬機(jī)的垃圾收集的調(diào)度。在圖2所示的實(shí)施例中,在步驟208處,計(jì)算各個(gè)Java虛擬機(jī)相應(yīng)的目標(biāo)內(nèi)存使用值,并將目標(biāo)值分配到相應(yīng)的Java虛擬機(jī)。下文中將參照?qǐng)D3詳細(xì)描述如何計(jì)算各個(gè)Java虛擬機(jī)的目標(biāo)內(nèi)存使用值。 然后,在步驟210處,針對(duì)各個(gè)Java虛擬機(jī),判斷其當(dāng)前內(nèi)存使用值是否大于或等于目標(biāo)內(nèi)存使用值。若當(dāng)前沒有任何一臺(tái)Java虛擬機(jī)的內(nèi)存使用值大于或等于其相應(yīng)的目標(biāo)內(nèi)存使用值,則接收下一時(shí)刻的Java虛擬機(jī)內(nèi)存使用報(bào)告(步驟212),然后繼續(xù)執(zhí)行步驟210處的內(nèi)存使用值判斷。重復(fù)執(zhí)行步驟212處的接收內(nèi)存使用報(bào)告以及步驟210處的判斷,直到有Java虛擬機(jī)的內(nèi)存使用值大于或等于目標(biāo)內(nèi)存使用值。
當(dāng)在步驟210處檢測(cè)到有Java虛擬機(jī)的內(nèi)存使用值大于或等于目標(biāo)內(nèi)存使用值時(shí),在步驟214處,將其放入一隊(duì)列中,以等待發(fā)放令牌。然后在步驟216處,檢查是否有可用的令牌。如果沒有可用令牌,則在步驟218處,將這一情況記錄在日志中并進(jìn)行報(bào)告,然后等待令牌返回(步驟220)。而如果在步驟216處判定有可用令牌,則在步驟222處,從隊(duì)列中讀出待發(fā)放令牌的Java虛擬機(jī),并對(duì)其發(fā)放令牌。后文中將參照?qǐng)D4B來說明Java虛擬機(jī)在接收到該令牌后如何執(zhí)行垃圾收集的操作。 這里,需要說明的是,針對(duì)集群系統(tǒng)的令牌數(shù)可以是考慮該集群系統(tǒng)中的Java虛擬機(jī)的數(shù)量n、用于判斷同步垃圾收集趨勢(shì)時(shí)設(shè)定的預(yù)定數(shù)量m以及用戶對(duì)性能的要求來設(shè)定的,其可以是小于Java虛擬機(jī)的總數(shù)的一個(gè)或多個(gè)。例如,在電信業(yè)務(wù)中,用戶對(duì)系統(tǒng)的實(shí)時(shí)性能要求高,則不允許同時(shí)進(jìn)行垃圾收集的Java虛擬機(jī)太多。另一方面,如果設(shè)置的令牌數(shù)太少,則對(duì)于規(guī)模較大的集群環(huán)境來說,會(huì)導(dǎo)致隊(duì)列中等待發(fā)放令牌的Java虛擬機(jī)過多,嚴(yán)重時(shí)會(huì)造成這些等待的Java虛擬機(jī)在令牌發(fā)放之前就發(fā)生了被動(dòng)垃圾收集,使得本發(fā)明的調(diào)度效果大大降低。 下面將參照?qǐng)D3來說明如何計(jì)算各個(gè)Java虛擬機(jī)的目標(biāo)內(nèi)存使用值。首先,在步驟302處,根據(jù)在圖2中的步驟206處接收到的來自各個(gè)Java虛擬機(jī)的內(nèi)存使用報(bào)告中包含的內(nèi)存使用值,計(jì)算各個(gè)Java虛擬機(jī)相應(yīng)的內(nèi)存消耗率。然后在步驟304處,按照由小到大的順序排列各個(gè)Java虛擬機(jī)的當(dāng)前內(nèi)存使用值。 接著,在步驟306處,將根據(jù)在圖2的步驟202處接收到的垃圾收集報(bào)告中包含的自動(dòng)觸發(fā)垃圾收集的最大內(nèi)存使用值Ha設(shè)置為排在第一位的Java虛擬機(jī)的目標(biāo)內(nèi)存使用值,該排在第一位的Java虛擬機(jī)即為所述n個(gè)Java虛擬機(jī)中當(dāng)前內(nèi)存使用值最小的那臺(tái)Java虛擬機(jī)。需要說明的是,在該實(shí)施例中,將被動(dòng)垃圾收集發(fā)生時(shí)的最大內(nèi)存使用值Ha設(shè)置為當(dāng)前內(nèi)存使用值最小的Java虛擬機(jī)的目標(biāo)內(nèi)存使用值。然而,也可以設(shè)置小于該最大內(nèi)存使用值Ha的任意其他適合值作為Java虛擬機(jī)發(fā)生主動(dòng)垃圾收集的目標(biāo)內(nèi)存使用值。從最大化內(nèi)存使用率的角度出發(fā),選擇接近或略小于被動(dòng)垃圾收集的最大內(nèi)存使用值的目標(biāo)內(nèi)存使用值更為有利。 然后,在步驟308處,遵循下式來計(jì)算排在下一位的Java虛擬機(jī)相應(yīng)的目標(biāo)內(nèi)存使用值hJk: (hjk-hk) /Rhk = (hjk—「hk—》/Rhk—「F (hjk) -Tg, n > k > 2 式1
8
其中,n為集群環(huán)境中的Java虛擬機(jī)總數(shù), hjk表示要計(jì)算的排在第k位的Java虛擬機(jī)的目標(biāo)內(nèi)存使用值, hjk—工表示已經(jīng)設(shè)定或計(jì)算得到的排在第k-1位的Java虛擬機(jī)的目標(biāo)內(nèi)存使用值, hk和hk—工分別表示第k位和第k-1位的Java虛擬機(jī)的當(dāng)前內(nèi)存使用值, Rhk和Rhk—工分別表示在步驟302處計(jì)算得到的第k位和第k_l位的Java虛擬機(jī)
的內(nèi)存消耗率, Tg為相鄰垃圾收集之間的最小間隔時(shí)間,該參數(shù)可以是基于用戶對(duì)系統(tǒng)性能的要求而確定的,禾口 F(hJk)表示當(dāng)內(nèi)存使用值達(dá)到hJk時(shí),進(jìn)行垃圾收集所花的時(shí)間,該參量例如可以根據(jù)在圖2中的步驟202處接收到的垃圾收集報(bào)告中所包含的垃圾收集執(zhí)行時(shí)長(zhǎng)來確定。
然后,在步驟310處,判斷是否計(jì)算了所有Java虛擬機(jī)的目標(biāo)內(nèi)存使用值。如果確定已經(jīng)針對(duì)所有Java虛擬機(jī)進(jìn)行了計(jì)算,則返回到圖2中所示的調(diào)度流程中。否則,返回到步驟308處,繼續(xù)針對(duì)其他Java虛擬機(jī)計(jì)算目標(biāo)內(nèi)存使用值,直到計(jì)算了所有Java虛擬機(jī)的目標(biāo)內(nèi)存使用值。 利用圖3中示出的算法計(jì)算得到的目標(biāo)內(nèi)存使用值,使得可以在時(shí)間上基本均勻地調(diào)度各個(gè)Java虛擬機(jī)的垃圾收集,并且能夠保證內(nèi)存資源的使用率最大化。這里需要說明的是,上述計(jì)算目標(biāo)內(nèi)存使用值的算法僅僅是例示性的,本發(fā)明并不限于此。本領(lǐng)域技術(shù)人員根據(jù)本說明書的教習(xí),完全能夠理解其他適合的變型和改變都是可行的。例如,可以選擇使得各個(gè)Java虛擬機(jī)的垃圾收集在時(shí)間上非均勻地發(fā)生的目標(biāo)內(nèi)存使用值計(jì)算算法。另外,也可以按照(hjk-hk) /Rhk < (hjk—「hk—》/Rhk—「F (hjk) -Tg來選擇第k位Java虛擬機(jī)的目標(biāo)內(nèi)存使用值,盡管這樣會(huì)造成內(nèi)存資源的一定程度的浪費(fèi)。甚至,在不考慮系統(tǒng)內(nèi)存資源使用率以及系統(tǒng)實(shí)時(shí)響應(yīng)性能的情況下,可以隨機(jī)選取集群環(huán)境中的任一臺(tái)或幾臺(tái)Java虛擬機(jī),將它們的目標(biāo)內(nèi)存使用值設(shè)定為小于或等于最大內(nèi)存使用值Ha的任意值。
下面參照?qǐng)D4A和圖4B來說明根據(jù)本發(fā)明實(shí)施例的Java虛擬機(jī)內(nèi)處理。在本發(fā)明中,Java虛擬機(jī)需要監(jiān)測(cè)其內(nèi)存使用,并定期發(fā)送內(nèi)存使用報(bào)告。當(dāng)沒有發(fā)生同步垃圾收集從而不執(zhí)行垃圾收集主動(dòng)調(diào)度時(shí),Java虛擬機(jī)內(nèi)的處理如圖4A所示。隨著內(nèi)存被不斷消耗,而觸發(fā)垃圾收集,即被動(dòng)地垃圾收集(步驟402)。垃圾收集之后,在步驟404處,發(fā)送垃圾收集報(bào)告,以報(bào)告本次垃圾收集的類型、時(shí)刻、執(zhí)行時(shí)長(zhǎng)、觸發(fā)垃圾收集的內(nèi)存使用值以及垃圾收集后的內(nèi)存使用值。 而在執(zhí)行了圖2和圖3中的垃圾收集調(diào)度處理的情況下,如圖4B所示,Java虛擬機(jī)首先在步驟412處接收令牌,接著執(zhí)行主動(dòng)垃圾收集(步驟414)。與圖4A中的步驟404類似,在步驟416處Java虛擬機(jī)發(fā)送垃圾收集報(bào)告。然后,發(fā)生主動(dòng)垃圾收集的該Java虛擬機(jī)將令牌返回(步驟418)。從而,完成了一次主動(dòng)垃圾收集處理。 圖5以圖l所示的Java虛擬機(jī)集群結(jié)構(gòu)實(shí)例,示出了應(yīng)用了本發(fā)明的方法之后的內(nèi)存使用和垃圾收集調(diào)度情況。在圖5所示的Java虛擬機(jī)集群系統(tǒng)中,假設(shè)總共有4臺(tái)Java虛擬機(jī)JVM1、 JVM2、 JVM3和JVM4。如圖1所示,當(dāng)在圖2所示的步驟204處檢測(cè)到該集群環(huán)境中的4臺(tái)Java虛擬機(jī)出現(xiàn)了同步垃圾收集的趨勢(shì)時(shí),啟動(dòng)本發(fā)明的垃圾收集調(diào)度處理。在本例中,設(shè)定開始執(zhí)行垃圾收集調(diào)度處理的時(shí)刻為0。 首先,如步驟206所示,從4臺(tái)Java虛擬機(jī)接收各自的內(nèi)存使用報(bào)告。假設(shè)JVM1 、JVM2、 JVM3和JVM4當(dāng)前(即,0時(shí)刻處)的內(nèi)存使用值分別為100、 100、 110和120,并且它們的內(nèi)存消耗率均為Rh = 50M/s(兆/秒)。在本例中,假定自動(dòng)觸發(fā)垃圾收集的最大內(nèi)存使用值Ha = 950M,將該最大值Ha分配給JVM1作為其目標(biāo)內(nèi)存使用值hjl。根據(jù)用戶需求,將相鄰垃圾收集的時(shí)間間隔設(shè)置為Tg = 3s,并且在本例中,設(shè)定令牌數(shù)為1。另外,出于清楚說明的目的,假定各臺(tái)Java虛擬機(jī)在相應(yīng)的目標(biāo)內(nèi)存使用值下進(jìn)行垃圾收集所需的時(shí)間平均值為F(h) = ls。接下來,按照上述式1,依次計(jì)算JVM2、JVM3和JVM4的目標(biāo)內(nèi)存使用值hJ2、 hJ3和hJ4分別為750M、560M和370M,如圖5的圖表中第一行(0時(shí)刻)所示。 如圖5第二行所示,當(dāng)執(zhí)行到第5秒時(shí),JVM4的內(nèi)存使用值達(dá)到了其目標(biāo)值hJ4 =370M。由此,向該JVM4發(fā)放令牌,從而如圖4B所示在JVM4中觸發(fā)垃圾收集,然后JVM4返回令牌并發(fā)送垃圾收集報(bào)告。在垃圾收集執(zhí)行F(h) = ls之后,在第6秒處,看到進(jìn)行垃圾收集之后的JVM4的當(dāng)前內(nèi)存使用值為50M。從該時(shí)刻起,JVM4進(jìn)入如圖4A所示的自動(dòng)垃圾收集處理流程。隨著時(shí)間的推移,分別在第9秒、第13秒處,發(fā)現(xiàn)JVM3和JVM2的內(nèi)存使用值達(dá)到了相應(yīng)的目標(biāo)值hJ3 = 560M和hJ2 = 750M。由此,分別在JVM3和JVM2中執(zhí)行主動(dòng)垃圾收集,使得分別在第10秒和第14秒處,JVM3和JVM2中的內(nèi)存使用值為50M,并開始進(jìn)入自動(dòng)垃圾收集處理流程。最后,在第17秒處,JVMl達(dá)到了其目標(biāo)內(nèi)存使用值hJl =950M,從而執(zhí)行垃圾收集。從圖5中第18秒那一行的數(shù)據(jù)可見,經(jīng)過上述垃圾收集調(diào)度,使得JVM1、 JVM2、 JVM3和JVM4的當(dāng)前內(nèi)存使用值差別開,從而有效地消弱了出現(xiàn)同步垃圾收集的可能性。圖6中JVM1、JVM2、JVM3和JVM4的內(nèi)存使用值隨時(shí)間變化的曲線圖更清楚地示出了 ,經(jīng)過本發(fā)明的垃圾收集調(diào)度處理,從而避免了同步垃圾收集的發(fā)生。
圖7是示出了根據(jù)本發(fā)明實(shí)施例的具有垃圾收集調(diào)度功能的集群系統(tǒng)700的框圖。如圖所示,在該集群系統(tǒng)700中,具有n個(gè)Java虛擬機(jī)JVM1至JVMn。每臺(tái)Java虛擬機(jī)中都具有用于發(fā)送垃圾收集報(bào)告和內(nèi)存使用報(bào)告的報(bào)告裝置。該集群系統(tǒng)700還包括調(diào)度確定器740和垃圾收集(GC)調(diào)度器720。該調(diào)度確定器740接收來自JVM1至JVMn中每一個(gè)的報(bào)告裝置的垃圾收集報(bào)告,并按照?qǐng)D2中的步驟204所示基于該垃圾收集報(bào)告確定是否要進(jìn)行垃圾收集調(diào)度。當(dāng)調(diào)度確定器740確定要執(zhí)行垃圾收集調(diào)度時(shí),向垃圾收集調(diào)度器720發(fā)送調(diào)度指令。垃圾收集調(diào)度器720在接收到來自調(diào)度確定器740的調(diào)度指令后,接收來自所述n個(gè)報(bào)告裝置的內(nèi)存使用報(bào)告,并基于該內(nèi)存使用報(bào)告來調(diào)度JVM1至JVMn之間的垃圾收集。 圖8示出了垃圾收集調(diào)度器720的配置的框圖。該垃圾收集調(diào)度器720包括目標(biāo)內(nèi)存使用值控制器810和令牌控制器820。該目標(biāo)內(nèi)存使用值控制器810用于計(jì)算并向JVM1至JVMn中的每一個(gè)分配相應(yīng)的目標(biāo)內(nèi)存使用值。令牌控制器820基于目標(biāo)內(nèi)存使用值控制器810計(jì)算出的目標(biāo)內(nèi)存使用值執(zhí)行控制,以向當(dāng)前內(nèi)存使用值大于由目標(biāo)內(nèi)存使用值控制器得到的相應(yīng)的目標(biāo)內(nèi)存使用值的Java虛擬機(jī)發(fā)放令牌,從而允許其進(jìn)行垃圾收集。 具體地,目標(biāo)內(nèi)存使用值控制器810包括內(nèi)存消耗率計(jì)算器812,用于根據(jù)接收到的所述內(nèi)存使用報(bào)告,計(jì)算JVM1至JVMn中每一個(gè)的內(nèi)存消耗率;排序器814,用于按照由小到大的順序排列JVM1至JVMn的當(dāng)前內(nèi)存使用值;和目標(biāo)內(nèi)存使用值計(jì)算器816,用于將自動(dòng)觸發(fā)垃圾收集的最大內(nèi)存使用值設(shè)定為排在第一位的Java虛擬機(jī)的目標(biāo)內(nèi)存使用
10值,該排在第一位的Java虛擬機(jī)即為所述n個(gè)Java虛擬機(jī)中當(dāng)前內(nèi)存使用值最小的那臺(tái)Java虛擬機(jī),并且該目標(biāo)內(nèi)存使用值計(jì)算器816還遵循上述式1來計(jì)算其他Java虛擬機(jī)相應(yīng)的目標(biāo)內(nèi)存使用值。而令牌控制器820包括令牌數(shù)設(shè)定裝置822,用于考慮Java虛擬機(jī)數(shù)量n以及用戶對(duì)性能的要求,設(shè)定該集群環(huán)境中的令牌數(shù);和令牌發(fā)放裝置824,用于將當(dāng)前內(nèi)存使用值大于由所述目標(biāo)內(nèi)存使用值控制器分配的相應(yīng)的目標(biāo)內(nèi)存使用值的Java虛擬機(jī)放入一隊(duì)列,并依次向隊(duì)列中等待的小于或等于由所述令牌數(shù)設(shè)定裝置822設(shè)定的令牌數(shù)個(gè)Java虛擬機(jī)發(fā)放令牌,以允許其進(jìn)行垃圾收集。 應(yīng)當(dāng)注意,圖8中示出的垃圾收集調(diào)度器僅僅是示例性的。本領(lǐng)域技術(shù)人員通過閱讀對(duì)圖2至圖6的描述,可以構(gòu)想出包括實(shí)現(xiàn)這些圖中所示步驟的功能的模塊的垃圾收集調(diào)度器。 出于例示和說明的目的給出了對(duì)本發(fā)明的各種方面的以上描述。這并非旨在窮舉或?qū)⒈景l(fā)明限于所公開的精確形式,并且顯然可以進(jìn)行很多修改和變化。例如,上述多個(gè)實(shí)
施例中的步驟和模塊的各種適當(dāng)組合也是可行的。 在上文中以Java應(yīng)用為例說明了本發(fā)明的垃圾收集調(diào)度方法和裝置,然而本領(lǐng)域技術(shù)人員完全能夠構(gòu)想,本發(fā)明的方法和裝置也可應(yīng)用于基于其他具有垃圾收集機(jī)制的應(yīng)用中,例如基于Cft的應(yīng)用中。此外,本發(fā)明實(shí)施例的調(diào)度Java虛擬機(jī)的垃圾收集的方法和裝置可以應(yīng)用于任何基于Java的應(yīng)用服務(wù)器,尤其適用于對(duì)實(shí)時(shí)性能要求高的應(yīng)用系統(tǒng),而不限于本說明書中所公開的特定系統(tǒng)。另外,本領(lǐng)域技術(shù)人員應(yīng)該理解,本文中所稱"令牌"可以是信號(hào)、指令、操作或者其他適合形式。 因此,應(yīng)當(dāng)理解,本發(fā)明并不限于以上公開的特定實(shí)施例,而是旨在覆蓋由以下權(quán)利要求所限定的修改和變型。
權(quán)利要求
一種集群系統(tǒng),包括多個(gè)虛擬機(jī),其各自具有用于發(fā)送垃圾收集報(bào)告和內(nèi)存使用報(bào)告的報(bào)告裝置;調(diào)度確定器,其基于來自所述多個(gè)報(bào)告裝置的垃圾收集報(bào)告或者是否經(jīng)過了預(yù)定時(shí)段,來確定是否要進(jìn)行垃圾收集調(diào)度;以及垃圾收集調(diào)度器,在所述調(diào)度確定器確定要進(jìn)行垃圾收集調(diào)度時(shí),該垃圾收集調(diào)度器接收來自所述多個(gè)報(bào)告裝置的內(nèi)存使用報(bào)告,并基于該內(nèi)存使用報(bào)告來調(diào)度該集群系統(tǒng)中的所述多個(gè)虛擬機(jī)的垃圾收集。
2. 根據(jù)權(quán)利要求1所述的集群系統(tǒng),其中所述垃圾收集調(diào)度器包括 目標(biāo)內(nèi)存使用值控制器,用于計(jì)算并向所述多個(gè)虛擬機(jī)中的每一個(gè)分配相應(yīng)的目標(biāo)內(nèi)存使用值;禾口令牌控制器,用于執(zhí)行控制以向當(dāng)前內(nèi)存使用值大于由目標(biāo)內(nèi)存使用值控制器得到的 相應(yīng)的目標(biāo)內(nèi)存使用值的虛擬機(jī)發(fā)放令牌,從而允許其進(jìn)行垃圾收集。
3. 根據(jù)權(quán)利要求2所述的集群系統(tǒng),其中,所述目標(biāo)內(nèi)存使用值控制器包括 內(nèi)存消耗率計(jì)算器,用于根據(jù)接收到的所述內(nèi)存使用報(bào)告,計(jì)算所述多個(gè)虛擬機(jī)的內(nèi)存消耗率Rh ;排序器,用于按照由小到大的順序排列所述多個(gè)虛擬機(jī)的當(dāng)前內(nèi)存使用值;禾口 目標(biāo)內(nèi)存使用值計(jì)算器,用于將自動(dòng)觸發(fā)垃圾收集的最大內(nèi)存使用值設(shè)定為排在第一位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,該排在第一位的虛擬機(jī)即為所述多個(gè)虛擬機(jī)中當(dāng)前內(nèi)存使用值最小的那臺(tái)虛擬機(jī),并且該目標(biāo)內(nèi)存使用值計(jì)算器還遵循下式來計(jì)算其他虛擬機(jī)相應(yīng)的目標(biāo)內(nèi)存使用值<formula>formula see original document page 2</formula>其中,hjk表示要計(jì)算的排在第k位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,hjk—i表示排在第k-1位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,hk和hk—工分別表示第k位和第k-1位的虛擬機(jī)的當(dāng)前內(nèi)存使用值,RK和Rhk—工分別表示由內(nèi)存消耗率計(jì)算器計(jì)算得到的第k位和第k-1位的虛擬機(jī)的內(nèi)存消耗率,Tg為相鄰垃圾收集之間的最小間隔時(shí)間,和F(hJk)表示當(dāng)內(nèi)存使用值達(dá)到hjk時(shí),進(jìn)行垃圾收集所花的時(shí)間。
4. 根據(jù)權(quán)利要求2所述的集群系統(tǒng),其中,所述令牌控制器包括 令牌數(shù)設(shè)定裝置,用于考慮虛擬機(jī)數(shù)量以及用戶對(duì)性能的要求,設(shè)定該集群環(huán)境中的令牌數(shù);和令牌發(fā)放裝置,用于將當(dāng)前內(nèi)存使用值大于由所述目標(biāo)內(nèi)存使用值控制器分配的相應(yīng) 的目標(biāo)內(nèi)存使用值的虛擬機(jī)放入一隊(duì)列,并依次向隊(duì)列中等待的小于或等于由所述令牌數(shù) 設(shè)定裝置設(shè)定的令牌數(shù)個(gè)虛擬機(jī)發(fā)放令牌,以允許其進(jìn)行垃圾收集。
5. 根據(jù)權(quán)利要求1至4中任一項(xiàng)所述的集群系統(tǒng),其中,所述虛擬機(jī)是Java虛擬機(jī)或 C#虛擬機(jī)。
6. —種用于集群環(huán)境下多個(gè)虛擬機(jī)的垃圾收集調(diào)度器,該垃圾收集調(diào)度器接收來自所 述多個(gè)虛擬機(jī)的內(nèi)存使用報(bào)告,并基于該內(nèi)存使用報(bào)告來調(diào)度所述多個(gè)虛擬機(jī)之間的垃圾 收集。
7. 根據(jù)權(quán)利要求6所述的垃圾收集調(diào)度器,包括目標(biāo)內(nèi)存使用值控制器,用于計(jì)算并向所述多個(gè)虛擬機(jī)中的每一個(gè)分配相應(yīng)的目標(biāo)內(nèi) 存使用值;禾口令牌控制器,用于執(zhí)行控制以向當(dāng)前內(nèi)存使用值大于由目標(biāo)內(nèi)存使用值控制器得到的 相應(yīng)的目標(biāo)內(nèi)存使用值的虛擬機(jī)發(fā)放令牌,從而允許其進(jìn)行垃圾收集。
8. 根據(jù)權(quán)利要求7所述的垃圾收集調(diào)度器,其中,所述目標(biāo)內(nèi)存使用值控制器包括 內(nèi)存消耗率計(jì)算器,用于根據(jù)接收到的所述內(nèi)存使用報(bào)告,計(jì)算所述多個(gè)虛擬機(jī)的內(nèi)存消耗率Rh ;排序器,用于按照由小到大的順序排列所述多個(gè)虛擬機(jī)的當(dāng)前內(nèi)存使用值;禾口 目標(biāo)內(nèi)存使用值計(jì)算器,用于將自動(dòng)觸發(fā)垃圾收集的最大內(nèi)存使用值設(shè)定為排在第一位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,該排在第一位的虛擬機(jī)即為所述多個(gè)虛擬機(jī)中當(dāng)前內(nèi)存使用值最小的那臺(tái)虛擬機(jī),并且該目標(biāo)內(nèi)存使用值計(jì)算器還遵循下式來計(jì)算其他虛擬機(jī)相應(yīng)的目標(biāo)內(nèi)存使用值(hJk-hk)/Rhk = (hjk—「hk—》/RV「F(hJk)-Tg,其中,hjk表示要計(jì)算的排在第k位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,hjk—i表示排在第k-l位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,hk和hk—工分別表示第k位和第k-l位的虛擬機(jī)的當(dāng)前內(nèi)存使用值,RK和Rhk—工分別表示由內(nèi)存消耗率計(jì)算器計(jì)算得到的第k位和第k-l位的虛擬機(jī)的內(nèi)存消耗率,Tg為相鄰垃圾收集之間的最小間隔時(shí)間,和F(hJk)表示當(dāng)內(nèi)存使用值達(dá)到hjk時(shí),進(jìn)行垃圾收集所花的時(shí)間。
9. 根據(jù)權(quán)利要求7所述的垃圾收集調(diào)度器,其中,所述令牌控制器包括 令牌數(shù)設(shè)定裝置,用于考慮虛擬機(jī)數(shù)量以及用戶對(duì)性能的要求,設(shè)定該集群環(huán)境中的令牌數(shù);和令牌發(fā)放裝置,用于將當(dāng)前內(nèi)存使用值大于由所述目標(biāo)內(nèi)存使用值控制器分配的相應(yīng) 的目標(biāo)內(nèi)存使用值的虛擬機(jī)放入一隊(duì)列,并依次向隊(duì)列中等待的小于或等于由所述令牌數(shù) 設(shè)定裝置設(shè)定的令牌數(shù)個(gè)虛擬機(jī)發(fā)放令牌,以允許其進(jìn)行垃圾收集。
10. 根據(jù)權(quán)利要求6至9中任一項(xiàng)所述的垃圾收集調(diào)度器,其中,所述虛擬機(jī)是Java虛 擬機(jī)或C#虛擬機(jī)。
11. 一種用于控制集群環(huán)境中多個(gè)虛擬機(jī)內(nèi)的垃圾收集的調(diào)度的方法,包括 接收來自所述多個(gè)虛擬機(jī)的內(nèi)存使用報(bào)告;以及基于接收到的所述內(nèi)存使用報(bào)告,調(diào)度所述多個(gè)虛擬機(jī)內(nèi)的垃圾收集。
12. 根據(jù)權(quán)利要求11所述的方法,其中所述調(diào)度步驟包括 計(jì)算并向所述多個(gè)虛擬機(jī)中的每一個(gè)分配相應(yīng)的目標(biāo)內(nèi)存使用值;禾口 向當(dāng)前內(nèi)存使用值大于其相應(yīng)的目標(biāo)內(nèi)存使用值的虛擬機(jī)發(fā)放令牌,以允許其進(jìn)行垃圾收集。
13. 根據(jù)權(quán)利要求12所述的方法,其中,所述計(jì)算并分配目標(biāo)內(nèi)存使用值的步驟包括根據(jù)接收到的所述內(nèi)存使用報(bào)告,計(jì)算所述多個(gè)虛擬機(jī)的內(nèi)存消耗率Rh ;按照由小到大的順序排列所述多個(gè)虛擬機(jī)的當(dāng)前內(nèi)存使用值;將自動(dòng)觸發(fā)垃圾收集的最大內(nèi)存使用值設(shè)定為排在第一位的虛擬機(jī)的目標(biāo)內(nèi)存使用 值,該排在第一位的虛擬機(jī)即為所述多個(gè)虛擬機(jī)中當(dāng)前內(nèi)存使用值最小的那臺(tái)虛擬機(jī);以 及遵循下式來計(jì)算其他虛擬機(jī)相應(yīng)的目標(biāo)內(nèi)存使用值(hJk_hk)/Rhk = (hjk—「hk—》/RV「F(hJk)-Tg,其中,hjk表示要計(jì)算的排在第k位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,hjk—i表示排在第k-1位的虛擬機(jī)的目標(biāo)內(nèi)存使用值,hk和hk—工分別表示第k位和第k-1位的虛擬機(jī)的當(dāng)前內(nèi)存使用值,Rhk和Rhk—工分別表示計(jì)算出的第k位和第k-1位的虛擬機(jī)的內(nèi)存消耗率,Tg為相鄰垃圾收集之間的最小間隔時(shí)間,和F(hJk)表示當(dāng)內(nèi)存使用值達(dá)到hjk時(shí),進(jìn)行垃圾收集所花的時(shí)間。
14. 根據(jù)權(quán)利要求12所述的方法,其中,所述令牌發(fā)放步驟包括 考慮虛擬機(jī)數(shù)量以及用戶對(duì)性能的要求,設(shè)定該集群環(huán)境中的令牌數(shù);禾口 將當(dāng)前內(nèi)存使用值大于所分配的相應(yīng)的目標(biāo)內(nèi)存使用值的虛擬機(jī)放入一隊(duì)列,并依次向隊(duì)列中等待的小于或等于所述令牌數(shù)個(gè)虛擬機(jī)發(fā)放令牌,以允許其進(jìn)行垃圾收集。
15. 根據(jù)權(quán)利要求11所述的方法,還包括如下步驟基于來自所述多個(gè)虛擬機(jī)的垃圾 收集報(bào)告或者是否經(jīng)過了預(yù)定時(shí)段,來確定是否要進(jìn)行垃圾收集調(diào)度。
16. 根據(jù)權(quán)利要求11至15中任一項(xiàng)所述的方法,其中,所述虛擬機(jī)是Java虛擬機(jī)或 C#虛擬機(jī)。
全文摘要
本發(fā)明公開了一種用于調(diào)度集群環(huán)境中多個(gè)虛擬機(jī)內(nèi)的垃圾收集的方法、裝置和系統(tǒng)。在本發(fā)明的調(diào)度方法中,首先接收來自所述多個(gè)虛擬機(jī)的內(nèi)存使用報(bào)告,然后基于接收到的所述內(nèi)存使用報(bào)告,通過發(fā)放令牌的形式調(diào)度所述多個(gè)虛擬機(jī)內(nèi)的垃圾收集活動(dòng)。利用本發(fā)明的方法和裝置,避免了多個(gè)虛擬機(jī)之間出現(xiàn)同步垃圾收集,從而提高了集群系統(tǒng)的實(shí)時(shí)性能,同時(shí)基本上不會(huì)降低內(nèi)存利用率。
文檔編號(hào)G06F12/00GK101751335SQ20081017972
公開日2010年6月23日 申請(qǐng)日期2008年11月28日 優(yōu)先權(quán)日2008年11月28日
發(fā)明者吳海珊, 李立, 田瑞雄, 趙邑新 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
甘孜县| 安乡县| 任丘市| 南岸区| 吉水县| 闽侯县| 历史| 贵阳市| 长汀县| 佛学| 宁安市| 滕州市| 象州县| 永胜县| 余庆县| 汝南县| 吉首市| 汕尾市| 卢氏县| 岢岚县| 福贡县| 尉氏县| 昌吉市| 新蔡县| 韶关市| 正安县| 二手房| 珲春市| 田阳县| 和田市| 黎川县| 富顺县| 固原市| 宝丰县| 天等县| 尤溪县| 噶尔县| 安丘市| 邵阳市| 张掖市| 宿州市|