JavaGis

          JavaGis大草原

           

          J2EE性能調(diào)優(yōu)(轉(zhuǎn)載)

          性能問(wèn)題的最明顯表現(xiàn)是網(wǎng)頁(yè)的響應(yīng)時(shí)間變慢。在J2EE系統(tǒng)中,經(jīng)常體現(xiàn)有下面更為基本的癥狀:

        1. 應(yīng)用服務(wù)器資源的使用情況
        2. JVM堆的使用情況
        3. 系統(tǒng)資源的使用情況
        4. 數(shù)據(jù)庫(kù)資源的使用情況
        5. 網(wǎng)絡(luò)活動(dòng)

          ????????這些現(xiàn)象表明J2EE應(yīng)用依賴(lài)很多外部資源,并且是運(yùn)行在一個(gè)層次化的執(zhí)行模式的環(huán)境中:


          ????????由于Java虛擬機(jī)和應(yīng)用服務(wù)器掩蓋了操作系統(tǒng)和硬件的特性,所以在設(shè)計(jì)軟件系統(tǒng)時(shí),架構(gòu)工程師更應(yīng)該深刻理解整個(gè)操作環(huán)境。

          ????????在設(shè)計(jì)軟件系統(tǒng)時(shí),架構(gòu)工程師應(yīng)把性能和可擴(kuò)展性放在首位,然后開(kāi)始尋找容易解決的問(wèn)題,反應(yīng)時(shí)間緩慢通常的原因是訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)效率低和過(guò)多地調(diào)用遠(yuǎn)程對(duì)象和方法。接下來(lái),架構(gòu)工程師可繼續(xù)尋找不明顯的原因,例如算法的累積影響和不必要的開(kāi)銷(xiāo)。

          ????????現(xiàn)在市場(chǎng)上的各個(gè)J2EE應(yīng)用服務(wù)器有很多配置項(xiàng)目。這里只簡(jiǎn)單介紹一些常見(jiàn)的性能優(yōu)化配置項(xiàng)目。

          ????????很多應(yīng)用服務(wù)器都有一些與J2EE規(guī)范有關(guān)的操作系統(tǒng)配置項(xiàng)目或非標(biāo)準(zhǔn)的特性,這可以提高系統(tǒng)性能。應(yīng)該化時(shí)間來(lái)理解這些性能配置。

          Java虛擬機(jī)堆和垃圾回收設(shè)置

          ????????任何Java應(yīng)用的性能調(diào)整基礎(chǔ)都涉及到堆的大小和垃圾回收設(shè)置。(這里主要討論Sun HotSpor JVM).

          ????????堆可分為三代,年輕的(新的),年老的和持久的。Hotspot JVM的內(nèi)存基本配置包括最大堆大小,初始堆大小和年輕一代堆的大小。當(dāng)配置最大堆大小時(shí)可參考下面一些指導(dǎo):

        6. 最大大小應(yīng)小于物理內(nèi)存,避免虛存的頁(yè)面調(diào)度。
        7. 需要減去其他進(jìn)程使用的內(nèi)存
        8. 在負(fù)載測(cè)試時(shí)進(jìn)行優(yōu)化

          ????????注意不要將最大堆大小設(shè)置得過(guò)大。堆越大,內(nèi)存中保存的對(duì)象越多。內(nèi)存中對(duì)象越多,回收過(guò)程時(shí)間越長(zhǎng)。

          ????????配置初試堆大小的一般性策略包括:

        9. 將初始大小設(shè)置為最大堆大小
        10. 將初始大小設(shè)置為最大堆大小的1/4到1/2

          ????????對(duì)于年輕一代堆大小,Sun 推薦是設(shè)置為最大堆大小的1/3。

          ????????也可以選擇不同的垃圾回收算法。首先是增量垃圾回收。該算法的意思是減少單個(gè)對(duì)象回收停頓時(shí)間,這樣的結(jié)果是整體回收性能的下降。該算法將相互引用的對(duì)象分組,然后嘗試按組回收。嘗試回收的部分越小,回收處理的時(shí)間往往會(huì)越少。

          ????????1.4.1版的HotSpot JVM增加了兩個(gè)垃圾回收算法:并行算法和并發(fā)算法。

          ????????在年輕一代堆中實(shí)現(xiàn)了并行算法。在多處理器的機(jī)器上,這種回收算法使用了多線(xiàn)程來(lái)提高性能。雖然這個(gè)算法會(huì)暫停所有的應(yīng)用線(xiàn)程,但是由于利用了多個(gè)CPU使得回收時(shí)間非常快。在年輕一代堆中,該算法顯著地減少了回收帶來(lái)的停頓。

          ????????在年老一代堆中實(shí)現(xiàn)了并發(fā)算法。在應(yīng)用中最大限度地執(zhí)行并發(fā)。回收過(guò)程分為4個(gè)階段,覆蓋了可回收對(duì)象的標(biāo)記和清除操作。前兩個(gè)過(guò)程會(huì)暫停應(yīng)用線(xiàn)程,后兩階段可與應(yīng)用并發(fā)執(zhí)行。并發(fā)垃圾回收算法的"最大限度并發(fā)"特點(diǎn)可以使JVM利用更大的堆和多個(gè)CPU。因此應(yīng)關(guān)注由于采用缺省的mark-compact(標(biāo)記-壓縮)和stop-the-world(停頓所有處理)等垃圾回收算法所帶來(lái)的延遲和吞吐量問(wèn)題。

          處理線(xiàn)程

          ????????J2EE應(yīng)用服務(wù)器是多線(xiàn)程的應(yīng)用。應(yīng)用服務(wù)器的線(xiàn)程是一種資源池,處理請(qǐng)求和和應(yīng)用服務(wù)器的內(nèi)部功能等任務(wù)共享這些資源。

          ????????很多應(yīng)用服務(wù)器允許為特定的任務(wù)或應(yīng)用配置不同大小的線(xiàn)程池。通常需要增加這些線(xiàn)程池的大小以滿(mǎn)足應(yīng)用負(fù)載的需要。

          ????????架構(gòu)工程師應(yīng)該避免將線(xiàn)程池大小設(shè)置過(guò)大,這是因?yàn)闀?huì)增加上下文交換的次數(shù),從而降低應(yīng)用的性能。線(xiàn)程池的大小通常應(yīng)該能最大利用機(jī)器上的CPU,同時(shí)又不能使CPU過(guò)載。

          EJB配置項(xiàng)目

          ???????? 在應(yīng)用服務(wù)器中,很多不同類(lèi)型的EJB是以資源池的方式實(shí)現(xiàn)的。通常這些池大小和初始Bean的數(shù)量會(huì)明顯影響應(yīng)用的性能。

          ????????架構(gòu)工程師應(yīng)該避免將這些池大小設(shè)置的過(guò)大,這樣會(huì)導(dǎo)致不必要地消耗JVM和操作系統(tǒng)內(nèi)存。另外,將初始Bean數(shù)量設(shè)置過(guò)高會(huì)使得應(yīng)用服務(wù)器的啟動(dòng)時(shí)間長(zhǎng)的難以接受。

          ????????在應(yīng)用服務(wù)器中,緩存很多不同類(lèi)型的EJB。緩存大小和超時(shí)設(shè)置通常也會(huì)對(duì)應(yīng)用性能帶來(lái)顯著影響。

          ???????? 架構(gòu)工程師應(yīng)該避免將緩寸大小設(shè)置過(guò)大,這同樣會(huì)不必要地消耗大量JVM和操作系統(tǒng)內(nèi)存。此外,應(yīng)避免設(shè)置過(guò)長(zhǎng)的超時(shí)--例如當(dāng)EJB不用時(shí),仍被緩存---,這也會(huì)導(dǎo)致不必要地消耗大量?jī)?nèi)存。

          數(shù)據(jù)庫(kù)配置項(xiàng)目

          ????????J2EE規(guī)范要求應(yīng)用服務(wù)器廠商必須提供數(shù)據(jù)庫(kù)連接資源池功能。通常增加數(shù)據(jù)庫(kù)連接池的大小會(huì)提高性能。架構(gòu)工程師應(yīng)該考慮不同類(lèi)型的SQL操作(例如事務(wù)型和批處理型)應(yīng)使用不同的連接池。如果一個(gè)消息Bean執(zhí)行批處理操作,那么應(yīng)該為此另創(chuàng)建一個(gè)連接池,而不要與事務(wù)型操作使用同一個(gè)連接池。

          ????????很多J2EE應(yīng)用服務(wù)器提供了Prepared Statement 的緩存功能。創(chuàng)建Prepared Statement是很耗費(fèi)資源的。在事務(wù)型的J2EE應(yīng)用中通常執(zhí)行很多同樣的SQL語(yǔ)句,只是參數(shù)不同而已。所以在應(yīng)用中應(yīng)發(fā)揮數(shù)據(jù)庫(kù)配置項(xiàng)目的作用,盡量使用Prepared Statement。

        11. ?

        12. 好的開(kāi)始是成功的一半。對(duì)于J2EE同樣如此,我們知道當(dāng)開(kāi)發(fā)應(yīng)用時(shí),在架構(gòu)設(shè)計(jì)階段的決定將對(duì)應(yīng)用的性能和可擴(kuò)展性產(chǎn)生深遠(yuǎn)的影響。

          ????????現(xiàn)在當(dāng)開(kāi)發(fā)一個(gè)應(yīng)用項(xiàng)目時(shí),我們?cè)絹?lái)越多地注意到了性能和可擴(kuò)展性的問(wèn)題。應(yīng)用性能的問(wèn)題比應(yīng)用功能的不豐富問(wèn)題往往更為嚴(yán)重,前者會(huì)影響到所有用戶(hù),而后者只會(huì)影響到碰巧使用該功能的那些用戶(hù)。

          ????????作為應(yīng)用系統(tǒng)的負(fù)責(zé)人,一直被要求"要少花錢(qián)多辦事"----用更少的硬件,更少的網(wǎng)絡(luò)帶寬,以及更短的時(shí)間完成更多的任務(wù)。J2EE通過(guò)提供組件方式和通用的中間件服務(wù)是目前首選的最優(yōu)方式。而要能夠構(gòu)建一個(gè)具有高性能和可擴(kuò)展性的J2EE應(yīng)用,需要遵循一些基本的架構(gòu)策略。

          緩存(Caching):

          ????????簡(jiǎn)單地說(shuō),緩存中存放著頻繁訪(fǎng)問(wèn)的數(shù)據(jù),在應(yīng)用的整個(gè)生命周期中,這些數(shù)據(jù)存放在持久性存儲(chǔ)器或存放在內(nèi)存中。在實(shí)際環(huán)境中,典型的現(xiàn)象是在分布式系統(tǒng)中每個(gè)JVM中有一個(gè)緩存的實(shí)例或者在多個(gè)JVM中有一個(gè)緩存的實(shí)例。

          ????????緩存數(shù)據(jù)是通過(guò)避免訪(fǎng)問(wèn)持久性存儲(chǔ)器來(lái)提高性能的,否則會(huì)導(dǎo)致過(guò)多的磁盤(pán)訪(fǎng)問(wèn)和過(guò)于頻繁網(wǎng)絡(luò)數(shù)據(jù)傳輸。

          復(fù)制:

          ????????復(fù)制是通過(guò)在多臺(tái)物理機(jī)器上創(chuàng)建指定應(yīng)用服務(wù)的多個(gè)拷貝來(lái)獲得整體更大吞吐效率。理論上看,如果一個(gè)服務(wù)被復(fù)制成兩個(gè)服務(wù),那么系統(tǒng)將可處理兩倍的請(qǐng)求。

          ????????復(fù)制是通過(guò)單一服務(wù)的多個(gè)實(shí)例的方式從而減少每個(gè)服務(wù)的負(fù)載來(lái)提高性能的。

          并行處理

          ????????并行處理將一個(gè)任務(wù)分解為更為簡(jiǎn)單的子任務(wù),并能夠同時(shí)在不同的線(xiàn)程中執(zhí)行。

          ????????并行處理是通過(guò)利用J2EE層執(zhí)行模式的多線(xiàn)程和多CPU特點(diǎn)來(lái)提高性能。與使用一個(gè)線(xiàn)程或CPU處理任務(wù)相比,以并行方式處理多個(gè)子任務(wù)可以使操作系統(tǒng)在多個(gè)線(xiàn)程或處理器中進(jìn)行分配這些子任務(wù)。

          異步處理

          ????????應(yīng)用功能通常被設(shè)計(jì)為同步或串行方式。異步處理只處理那些非常重要的任務(wù)部分,然后將控制立即返回給調(diào)用者,其他任務(wù)部分將在稍后執(zhí)行。

          ????????異步處理是通過(guò)縮短那些在將控制返回給用戶(hù)之前必須處理的時(shí)間來(lái)提高性能的。雖然都做同樣多的事情,但是用戶(hù)不必等到整個(gè)過(guò)程完成就可以繼續(xù)發(fā)出請(qǐng)求了。

          資源池

          ????????資源池技術(shù)使用的是一套準(zhǔn)備好的資源。與在請(qǐng)求和資源之間維持1:1的關(guān)系的不同,這些資源可被所有請(qǐng)求所共享。

          ????????資源池的使用是有條件的,需要衡量下面兩種方式的代價(jià):

          ????????A,維持一套可被所有請(qǐng)求共享資源的代價(jià)

          ????????B,為每個(gè)請(qǐng)求都重新創(chuàng)建一個(gè)資源的代價(jià)

          ????????當(dāng)前者小于后者時(shí),使用資源池才是有效率的。


        13. ????????構(gòu)建高性能的J2EE應(yīng)用不但需要了解常用的實(shí)施技巧。下面介紹最常用的10種有效方法,可幫助架構(gòu)設(shè)計(jì)師們快速成為這方面的專(zhuān)家。

          Java性能的基礎(chǔ)----內(nèi)存管理

          ????????任何Java應(yīng)用,單機(jī)的或J2EE的性能基礎(chǔ)都可歸結(jié)到你的應(yīng)用是如何管理內(nèi)存的問(wèn)題。Java的內(nèi)存管理包括兩個(gè)重要任務(wù):內(nèi)存的分配和內(nèi)存的回收。在內(nèi)存的分配中,目標(biāo)是要減少需要?jiǎng)?chuàng)建的對(duì)象。 內(nèi)存回收是導(dǎo)致性能下降的普遍原因。也就是說(shuō),內(nèi)存中的對(duì)象越多,垃圾回收越困難。所以我們對(duì)創(chuàng)建對(duì)象的態(tài)度應(yīng)該越保守越好。

          ????????在J2EE應(yīng)用中常見(jiàn)的兩個(gè)內(nèi)存有關(guān)的問(wèn)題是:游離的對(duì)象(也被稱(chēng)為內(nèi)存泄露)和對(duì)象循環(huán)(指大量頻繁創(chuàng)建和刪除-在Java中體現(xiàn)為解除引用---對(duì)象)。

          ????????我們應(yīng)注意確保所有可到達(dá)的對(duì)象實(shí)際是活的,即這些對(duì)象不但在內(nèi)存中,而且也要在執(zhí)行的代碼中是存在的。當(dāng)對(duì)象在應(yīng)用中已經(jīng)沒(méi)有用了,而我們卻忘記了刪除對(duì)該對(duì)象的引用時(shí),游離的對(duì)象就出現(xiàn)了。

          ????????我們知道垃圾回收會(huì)占用CPU時(shí)間。短期對(duì)象的大量創(chuàng)建增加了垃圾回收的頻率會(huì)造成性能下降。

          不要在Servlet中實(shí)現(xiàn)業(yè)務(wù)邏輯

          ????????在構(gòu)建J2EE應(yīng)用時(shí),架構(gòu)工程師通常會(huì)使用到J2EE的基本部分,Servlet。

          ????????如果架構(gòu)師不使用Session Beans, Entity Beans, 或 Message Beans, 那么改進(jìn)性能的方法就很少。只能采用增加CPU或更多的物理服務(wù)器等方法。EJB使用了緩存(cache)和資源池等方法可以提高性能和擴(kuò)展性。

          盡可能使用本地接口訪(fǎng)問(wèn)EJB

          ????????在早期的J2EE (遵循EJB1.X規(guī)范)應(yīng)用中,訪(fǎng)問(wèn)EJB是`通過(guò)RMI使用遠(yuǎn)程接口實(shí)現(xiàn)的。隨著EJB2.0的出現(xiàn),可以通過(guò)本地接口訪(fǎng)問(wèn)EJB,不再使用RMI,在同一個(gè)JVM中使用遠(yuǎn)程方法已經(jīng)少多了。但是現(xiàn)在還是有一些使用EJB1.X實(shí)現(xiàn)的應(yīng)用和不知道使用本地接口的一些EJB新手。為說(shuō)明這點(diǎn),我們作個(gè)比較:

          ????????1. 客戶(hù)端應(yīng)用調(diào)用本地Stub

          ????????2. 該Stub裝配參數(shù)

          ????????3. 該Stub傳到skeleton

          ????????4. 該skeleton分解參數(shù)

          ????????5. 該skeleton調(diào)用EJB對(duì)象

          ????????6. EJB對(duì)象執(zhí)行容器服務(wù)

          ????????7. EJB對(duì)象調(diào)用企業(yè)BEAN實(shí)例

          ????????8. 企業(yè)BEA執(zhí)行操作

          ????????9. 執(zhí)行組裝/分解步驟然后返回

          ????????與遠(yuǎn)程接口處理相比較,本地接口的EJB方法是:

          ????????????????1. 客戶(hù)端調(diào)用本地對(duì)象

          ????????????????2. 本地對(duì)象執(zhí)行容器服務(wù)

          ????????????????3. 本地對(duì)象調(diào)用企業(yè)Bean實(shí)例

          ????????????????4. 企業(yè)Bean實(shí)例執(zhí)行操作

          ????????????????5. 沒(méi)有其他返回步驟!!

          ????????如果你不需要從遠(yuǎn)程的客戶(hù)端訪(fǎng)問(wèn)一個(gè)特殊EJB,就應(yīng)該使用本地方法。

          在實(shí)現(xiàn)Session Bean的服務(wù)中封裝對(duì)實(shí)體EJB的訪(fǎng)問(wèn)

          ????????從Servlet訪(fǎng)問(wèn)實(shí)體EJB不但效率低而且難于維護(hù)。使用Session Fa?ade(會(huì)話(huà)外觀)模式可把對(duì)實(shí)體EJB的訪(fǎng)問(wèn)封裝在會(huì)話(huà)EJB中,在該會(huì)話(huà)EJB中通過(guò)使用本地接口訪(fǎng)問(wèn)實(shí)體EJB而避免過(guò)多的遠(yuǎn)程調(diào)用。

          ????????這項(xiàng)技術(shù)會(huì)有額外的性能和擴(kuò)展方面的好處,這是因?yàn)闀?huì)話(huà)和實(shí)體EJB可以使用緩存和資源池技術(shù)來(lái)進(jìn)行改進(jìn)。另外,由于負(fù)載的需要,會(huì)話(huà)和實(shí)體EJB可被擴(kuò)展部署到其他硬件設(shè)備上,這比將Servlet層復(fù)制擴(kuò)展到其他硬件設(shè)備上要簡(jiǎn)單的多。

          盡量粗粒度訪(fǎng)問(wèn)遠(yuǎn)程EJB

          ???????? 當(dāng)訪(fǎng)問(wèn)遠(yuǎn)程EJB時(shí),調(diào)用set/get方法將產(chǎn)生過(guò)多的網(wǎng)絡(luò)請(qǐng)求,同時(shí)也導(dǎo)致遠(yuǎn)程接口處理的過(guò)載。為避免這種情況,可考慮將數(shù)據(jù)屬性集中在一個(gè)對(duì)象中,這樣通過(guò)一次對(duì)遠(yuǎn)程EJB的調(diào)用就可以傳遞所有數(shù)據(jù)。這項(xiàng)技術(shù)就是數(shù)據(jù)傳輸對(duì)象(Data Transfer Object)模式。

          優(yōu)化SQL

          ????????J2EE的架構(gòu)設(shè)計(jì)工程師和開(kāi)發(fā)人員通常不是SQL專(zhuān)家或經(jīng)驗(yàn)豐富的數(shù)據(jù)庫(kù)管理員。首先應(yīng)該確保SQL使用了數(shù)據(jù)庫(kù)提供的索引支持。在某些情況下,將數(shù)據(jù)庫(kù)的索引和數(shù)據(jù)分開(kāi)存放會(huì)提高性能。但要知道,增加額外的索引可以提高SELECT性能但也會(huì)降低INSERT的性能。對(duì)于某些數(shù)據(jù)庫(kù),關(guān)聯(lián)表之間的排序會(huì)嚴(yán)重影響性能。可以多向數(shù)據(jù)庫(kù)管理員咨詢(xún)。

          避免在實(shí)體EJB中過(guò)多執(zhí)行SQL

          ????????有時(shí)候,通過(guò)實(shí)體EJB訪(fǎng)問(wèn)數(shù)據(jù)會(huì)執(zhí)行多個(gè)SQL語(yǔ)句。根據(jù)J2EE 規(guī)范,第一步,將調(diào)用實(shí)體Bean的find(發(fā)現(xiàn))方法;第二步,在第一次調(diào)用實(shí)體EJB的業(yè)務(wù)方法時(shí),容器會(huì)調(diào)用ejbLoad()從數(shù)據(jù)庫(kù)中獲得信息。

          ????????很多CMP(容器管理持久性)在調(diào)用發(fā)現(xiàn)方法時(shí)就緩存了實(shí)體數(shù)據(jù),所以在調(diào)用ejbLoad()時(shí)就不再訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)了。應(yīng)該避免使用BMP(Bean管理的持久性)或者自己實(shí)現(xiàn)緩存算法避免二次訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。

          使用Fast Lane Reader 模式訪(fǎng)問(wèn)只讀數(shù)據(jù)

          ????????J2EE應(yīng)用經(jīng)常要以只讀方式訪(fǎng)問(wèn)大量長(zhǎng)時(shí)間不變的數(shù)據(jù),而不是訪(fǎng)問(wèn)單個(gè)實(shí)體,例如瀏覽在線(xiàn)產(chǎn)品目錄。在這種只讀情況下,使用實(shí)體EJB訪(fǎng)問(wèn)數(shù)據(jù)會(huì)導(dǎo)致嚴(yán)重過(guò)載并且實(shí)現(xiàn)很麻煩。實(shí)體EJB 適合于對(duì)單個(gè)實(shí)體的粗粒度訪(fǎng)問(wèn),訪(fǎng)問(wèn)大量的列表只讀數(shù)據(jù)時(shí)效率不高。不管是使用CMP還是BMP,一定需要編寫(xiě)代碼操作多個(gè)實(shí)體EJB及其關(guān)聯(lián)。這將導(dǎo)致訪(fǎng)問(wèn)多個(gè)數(shù)據(jù)庫(kù)并存在大量的也是不必要的事務(wù)開(kāi)銷(xiāo)。

          利用Java Messaging Servce(消息服務(wù))

          ????????J2EE規(guī)范在JMS中提供了內(nèi)置的異步處理服務(wù)。當(dāng)涉及到系統(tǒng)需求時(shí),應(yīng)該了解在什么情況下應(yīng)該采用JMS進(jìn)行異步處理的設(shè)計(jì)。一旦確定要執(zhí)行一些異步處理,那么同步處理的任務(wù)就應(yīng)該越少越好,將數(shù)據(jù)庫(kù)密集的操作安排在稍后的異步處理中完成。

          緩存JNDI Lookup查找

          ????????很多操作在進(jìn)行JNDI查找時(shí)要消耗大量資源。通常應(yīng)該緩存JNDI資源避免網(wǎng)絡(luò)調(diào)用和某些處理的過(guò)載。可以緩存的JNDI查找包括:

          ????????EJB Home Interfaces

          ????????Data Sources

          ????????JMS Connection Factories

          ????????JMS Destinations/Topics

          ????????一些JNDI包實(shí)現(xiàn)了緩存功能。但是調(diào)用對(duì)EJB主接口的narrow方法時(shí),這種功能作用有限。

          ????????緩存查找的設(shè)計(jì)應(yīng)該使用共享的IntialContext實(shí)例,盡管構(gòu)建它很麻煩。這是因?yàn)樾枰L(fǎng)問(wèn)多種數(shù)據(jù)源,包括應(yīng)用資源文件JNDI.properties,系統(tǒng)屬性的各項(xiàng)參數(shù),傳入到構(gòu)造函數(shù)的各項(xiàng)參數(shù)。

          posted on 2006-09-02 14:31 zdygis 閱讀(634) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          Gis世界

          Java天空

          Oracle海洋

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 女性| 上蔡县| 祁门县| 石景山区| 奈曼旗| 蓝田县| 区。| 公主岭市| 巴东县| 上犹县| 菏泽市| 娄底市| 乌拉特中旗| 镇江市| 湖州市| 通化市| 孟连| 和硕县| 平武县| 邻水| 霞浦县| 天峻县| 嘉禾县| 汝城县| 普洱| 安吉县| 阜康市| 平南县| 四子王旗| 黔西县| 诸暨市| 永川市| 康保县| 新泰市| 阿鲁科尔沁旗| 宕昌县| 大洼县| 广水市| 措美县| 墨竹工卡县| 新竹市|