• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Java應(yīng)用的自頂向下性能優(yōu)化方法

      2018-11-19 11:05:40
      軟件導刊 2018年11期
      關(guān)鍵詞:線程內(nèi)存性能

      唐 科

      (電子科技大學成都學院 計算機系,四川 成都 611731)

      0 引言

      在各類Java應(yīng)用系統(tǒng)中,為了給大量并發(fā)用戶提供7×24小時持續(xù)不間斷響應(yīng)流暢的訪問體驗,系統(tǒng)設(shè)計必須精良。同時,在后續(xù)開發(fā)與維護過程中也必須考慮擴展性、可靠性,其核心就是滿足系統(tǒng)的性能需求,給用戶提供優(yōu)良的體驗。

      系統(tǒng)性能由應(yīng)用程序、系統(tǒng)環(huán)境、硬件配置等諸多因素決定,一種特定的配置無法滿足所有特性各異的上層應(yīng)用性能需求[1]。在這些因素中,確定的硬件和系統(tǒng)架構(gòu)決定了底層的訪問速度與吞吐量。良好的頂層軟件設(shè)計(應(yīng)用程序設(shè)計)卻能充分利用硬件和系統(tǒng)架構(gòu),最大限度地發(fā)揮系統(tǒng)資源的利用效率,形成性能優(yōu)良的應(yīng)用系統(tǒng)。所以,系統(tǒng)性能的優(yōu)化是由上述諸多因素相互作用決定的。

      Java應(yīng)用系統(tǒng)性能深受開發(fā)者及用戶重視,它是應(yīng)用系統(tǒng)的基礎(chǔ),一旦受損后果都是災(zāi)難性的。所以,確保應(yīng)用系統(tǒng)性能始終處于優(yōu)良狀態(tài),其重要性毋庸置疑?;诖?,研究人員提出了很多技術(shù)方法來優(yōu)化系統(tǒng)性能,但這些方法各自為政,不能形成系統(tǒng)優(yōu)化措施。針對此問題,本文提出自頂向下的Java應(yīng)用系統(tǒng)性能優(yōu)化方法,通過形成體系化的調(diào)優(yōu)策略達到優(yōu)化系統(tǒng)性能目的。

      1 相關(guān)研究

      在異構(gòu)系統(tǒng)編程環(huán)境應(yīng)用中,通過對編程容易度和編程應(yīng)用性能的綜合比較研究,得出表1與表2所示的結(jié)論[14]。Java具備良好的共享內(nèi)存自動分配機制,應(yīng)用設(shè)備內(nèi)存無限制、編程容易,但其性能較其它幾種語言偏低,所以,Java性能的優(yōu)化一直處于持續(xù)推進中。

      表1 異構(gòu)系統(tǒng)編程環(huán)境與內(nèi)存空間模型

      Java虛擬機(Java Virtual Machine,JVM)是其工作核心,也是性能調(diào)優(yōu)的重點。根據(jù)系統(tǒng)體系結(jié)構(gòu)采用指令級并行和多處理器并行,提供多線程擴展,將Java線程和虛擬處理器間的對應(yīng)關(guān)系與虛擬和物理處理器及操作系統(tǒng)間的對應(yīng)關(guān)系分開處理[4]。通過監(jiān)視運行情況確定其中運行熱點,再將熱點代碼段集中優(yōu)化編譯后直接運行。用直接的內(nèi)存引用替代對象句柄,提高內(nèi)存分配效率[4]。用操作系統(tǒng)中的線程實現(xiàn)虛擬機中的Java線程,降低線程間的干擾,提供快速線程同步機制[4]。此外還采用即時編譯、動態(tài)優(yōu)化[4]以及字節(jié)碼優(yōu)化等技術(shù)[6]。

      表2 異構(gòu)系統(tǒng)編程環(huán)境及其性能、編程容易度比較

      除JVM外,針對操作系統(tǒng)層次的性能,數(shù)據(jù)采集與監(jiān)控分析也是研究重點。其中,文獻[16]、[17]、[18]、[19]提出了資源監(jiān)控系統(tǒng)及其實現(xiàn),在操作系統(tǒng)層進行資源消耗的數(shù)據(jù)采集,如CPU占用時間、CPU負載、內(nèi)存分配與占用、文件傳輸負載、網(wǎng)絡(luò)傳輸負載等。通過對這些數(shù)據(jù)進行分析找到性能的瓶頸所在,并據(jù)此進行優(yōu)化操作。文獻[20]則以Java支持的自動垃圾回收機制的運行環(huán)境為切入點,深入研究內(nèi)存泄露問題,并明確指出內(nèi)存泄漏的檢測應(yīng)是低侵入性、合理負載、不影響應(yīng)用與JVM的正常運行。

      Java應(yīng)用系統(tǒng)不僅涉及操作系統(tǒng)、JVM等底層,還與Web應(yīng)用、數(shù)據(jù)庫應(yīng)用等密切相關(guān),所以它們的優(yōu)化也是必須關(guān)注的。文獻[2]以JVM性能調(diào)優(yōu)為基礎(chǔ),實現(xiàn)了Java Servlet模式下的WebGIS服務(wù)器性能優(yōu)化。文獻[5]、[7]則提出了服務(wù)器端的優(yōu)化與Web前端程序代碼優(yōu)化相結(jié)合的方法,達到表現(xiàn)層的性能調(diào)優(yōu)目的。文獻[8]、[9]則通過研究結(jié)構(gòu)設(shè)計、內(nèi)存優(yōu)化、索引優(yōu)化、SQL優(yōu)化等方式,對數(shù)據(jù)庫的應(yīng)用性能進行了調(diào)優(yōu)。

      大部分性能優(yōu)化工作集中在底層,隨著計算機硬件體系和制造技術(shù)的進步,以及JDK的不斷推陳出新,底層的性能優(yōu)化也不斷得到提高。但是,Java應(yīng)用系統(tǒng)的良好性能并不僅僅依靠底層的優(yōu)化,而是必須形成一個完整的體系。相關(guān)工作缺少系統(tǒng)優(yōu)化思想,各自為政,無法從整個系統(tǒng)角度調(diào)優(yōu)系統(tǒng)性能。所以,本文在此基礎(chǔ)上提出了一種自頂向下的Java應(yīng)用系統(tǒng)性能優(yōu)化方法,根據(jù)工程項目應(yīng)用開發(fā)特點,從系統(tǒng)頂層設(shè)計開始進行性能優(yōu)化,覆蓋了應(yīng)用層、容器層、數(shù)據(jù)持久化層、JVM層、操作系統(tǒng)與網(wǎng)絡(luò)層。該方法將貫穿于應(yīng)用項目設(shè)計之初直至應(yīng)用項目的生命周期終結(jié)為止,是一個綜合的系統(tǒng)工程。

      2 自頂向下的系統(tǒng)性能優(yōu)化方法

      自頂向下的Java應(yīng)用系統(tǒng)性能優(yōu)化方法對系統(tǒng)進行整體性能優(yōu)化,充分考慮了各個層面的性能調(diào)優(yōu)以及它們之間的相互影響,并根據(jù)設(shè)計目標與需求進行平衡,取得系統(tǒng)整體性能最大化調(diào)優(yōu)結(jié)果。該方法整體結(jié)構(gòu)如圖1所示。

      圖1 自頂向下Java應(yīng)用系統(tǒng)性能優(yōu)化方法結(jié)構(gòu)

      2.1 應(yīng)用層

      系統(tǒng)性能優(yōu)化工作是全局性的而非局部性的,過去的一些優(yōu)化案例[3]表明,系統(tǒng)部署運行以后進行的性能分析與調(diào)優(yōu)可能會導致應(yīng)用程序修改,為避免此種情況出現(xiàn),在應(yīng)用系統(tǒng)設(shè)計之初就應(yīng)當納入性能優(yōu)化的相應(yīng)工作,以良好的系統(tǒng)設(shè)計來規(guī)避許多潛在的性能問題,這便是應(yīng)用層的性能優(yōu)化。

      應(yīng)用層的性能優(yōu)化包括系統(tǒng)設(shè)計優(yōu)化與Java編碼實現(xiàn)優(yōu)化兩部分。系統(tǒng)設(shè)計優(yōu)化又包含了軟件結(jié)構(gòu)設(shè)計優(yōu)化和算法設(shè)計優(yōu)化,良好的軟件結(jié)構(gòu)設(shè)計對系統(tǒng)的整體性能有著至關(guān)重要的作用,它的應(yīng)用會避免許多可能出現(xiàn)的性能問題??茖W合理地使用設(shè)計模式將有助于形成良好的軟件結(jié)構(gòu)。例如:對于頻繁使用的那些重量級對象采用單例模式,可減少new操作的次數(shù),節(jié)約創(chuàng)建對象的時間,降低系統(tǒng)內(nèi)存的使用頻率。通過代理模式實現(xiàn)延遲加載,提高系統(tǒng)性能,加快系統(tǒng)的反應(yīng)速度。應(yīng)用享元模式復用重量級對象,節(jié)省重復創(chuàng)建對象帶來的開銷,減少創(chuàng)建對象的數(shù)量,優(yōu)化內(nèi)存結(jié)構(gòu)。

      算法設(shè)計優(yōu)化根據(jù)應(yīng)用的實際需求,合理使用數(shù)據(jù)結(jié)構(gòu),科學平衡時間、空間開銷使之總體最優(yōu)。例如通過使用緩沖協(xié)調(diào)上層組件和下層組件的性能差,減少等待時間等。為防止密集型的I/O操作成為系統(tǒng)瓶頸,要考慮緩沖技術(shù)。在程序中使用數(shù)據(jù)庫連接池和線程池,只對重量級對象使用對象池技術(shù)。良好的算法和數(shù)據(jù)結(jié)構(gòu)的效率對應(yīng)用系統(tǒng)的性能優(yōu)化是有益的[10-11]。

      Java編碼實現(xiàn)優(yōu)化需要程序員具備良好的個人編程習慣,正確應(yīng)用JDK API庫中的各類方法,編寫出高效精煉的代碼,讓應(yīng)用程序執(zhí)行更少的CPU指令,通過更短的執(zhí)行路徑實現(xiàn)程序功能,確保系統(tǒng)的整體最優(yōu)性能。例如使用最優(yōu)方法提高算法實現(xiàn)效率,使用StringBuilder代替字符串連接運算符“+”,多使用棧,盡量避免應(yīng)用遞歸。遞歸非常消耗資源,在計算密集型的代碼中,要避免使用正則表達式。不要調(diào)用高開銷的方法,優(yōu)化自定義hasCode()方法和equals()方法。減少對共享資源的競爭(鎖競爭)頻率,縮短鎖持有的時間等。

      應(yīng)用層性能優(yōu)化不僅為算法產(chǎn)生更有效率的代碼,而且會降低GC頻率,減少GC壓力,間接促進JVM的優(yōu)化。

      2.2 容器層

      容器層優(yōu)化涉及到開發(fā)和生產(chǎn)運行兩大階段。開發(fā)階段需要采用一些應(yīng)用層編碼實現(xiàn)的優(yōu)化技術(shù),還應(yīng)注意根據(jù)實際工程項目需求分別進行數(shù)據(jù)庫連接優(yōu)化、網(wǎng)絡(luò)訪問優(yōu)化、緩存應(yīng)用優(yōu)化、檢索優(yōu)化、文件的配置與訪問優(yōu)化等。開發(fā)階段的性能測試也不能忽視,例如訪問的壓力測試等。項目開發(fā)過程中選用適當?shù)臏y試工具進行性能測試,LoadRunner用于壓力測試,Jmeter用于性能測試。測試一些常用指標,如響應(yīng)時間、吞吐率、資源利用率、最大并發(fā)用戶數(shù)[12-13]等。而生產(chǎn)運行階段,在硬件設(shè)備上需要采用與開發(fā)階段不同的配置,同時選用適當?shù)臄?shù)據(jù)采集與監(jiān)聽工具,收集組合參數(shù)信息,根據(jù)這些信息分析判斷后再進行配置調(diào)諧、監(jiān)聽收集信息的迭代過程,直至性能優(yōu)化滿意達標為止。

      容器本身的性能要受到配置的影響,正確合理的配置是容器性能的保證。以甲骨文公司的GlassFish為例,它有開發(fā)模式和生產(chǎn)模式兩種。開發(fā)模式會允許JSP自動加載,檢查每個頁面是否有變化,開發(fā)者不用重新部署應(yīng)用程序就能看到運行結(jié)果,所以開發(fā)模式以損失性能的代價換來了靈活性,它只適用于項目工程的開發(fā)階段。而在生產(chǎn)運行階段,應(yīng)使容器配置為生產(chǎn)模式,它會關(guān)閉自動加載功能,避免了系統(tǒng)調(diào)用檢查文件的時間戳,不會影響多線程并發(fā)訪問同一JSP文件時容器的處理能力,也不會影響其應(yīng)用擴展性[3]。

      在容器中的Web應(yīng)用程序開發(fā)部署中,根據(jù)已有項目實現(xiàn)經(jīng)驗,應(yīng)遵循以下規(guī)則:使用init方法緩存靜態(tài)數(shù)據(jù)和資源引用,如果靜態(tài)引用資源則采用JSP的include指令,如果包含資源動態(tài)生成的響應(yīng),則用JSP的include標簽。剔除JSP頁面模板中保留的空格,可減少通過網(wǎng)絡(luò)傳遞的文件大小,改善網(wǎng)絡(luò)傳輸性能。在JSP中應(yīng)用jsp:useBean,一般大多數(shù)情況下使用className屬性,只在絕對必要時才使用beanName[3]。

      處于生產(chǎn)模式下的容器還需對其進行綜合監(jiān)控,通過組合參數(shù)尋找問題點。在GlassFish應(yīng)用中,對具有1-2個CPU的開發(fā)計算機來說,設(shè)置線程池的最大數(shù)為5;但對于多核多CPU的生產(chǎn)計算機,設(shè)置的線程池最大數(shù)應(yīng)為硬件線程數(shù)的2倍[3]。

      容器層優(yōu)化的目的是消除性能瓶頸,充分利用系統(tǒng)資源。隨著用戶負載的增加,使應(yīng)用能夠進行垂直擴展和水平擴展。

      2.3 數(shù)據(jù)持久化層

      應(yīng)用系統(tǒng)進行設(shè)計開發(fā)時,需要持久化層的優(yōu)化。對于那些應(yīng)用Java框架的系統(tǒng),如Spring、Hibernate、MyBatis等,它們的性能表現(xiàn)完全依賴持久化層性能。例如:通過應(yīng)用優(yōu)化的鍵生成器,減少生成主鍵的代價,使用JDBC批處理 inserts/updates減少來回傳輸,定期清理向數(shù)據(jù)庫添加或修改數(shù)據(jù)時保留的會話,使用二級查詢緩存等。

      數(shù)據(jù)持久化層提供對象-關(guān)系映射功能,并在Java應(yīng)用中管理關(guān)系數(shù)據(jù)。采用Java領(lǐng)域模型的應(yīng)用程序,通過該映射與關(guān)系型數(shù)據(jù)庫交互。在此過程中,持久層的性能優(yōu)化涉及到緩存容量配置、線程池配置、數(shù)據(jù)庫鎖策略等幾個方面。

      Java持久化API應(yīng)用的二級緩存容量會影響應(yīng)用程序的性能,如果應(yīng)用程序頻繁地訪問緩存,則會產(chǎn)生大量內(nèi)存,導致JVM也會頻繁地進行垃圾收集,反而降低了應(yīng)用程序性能。因此,合理配置緩存是關(guān)鍵。這是一個迭代過程,通過應(yīng)用系統(tǒng)運行過程的數(shù)據(jù)采集,分析、計算、判斷緩存的命中率,據(jù)此進行調(diào)節(jié)和合理設(shè)置。一般而言,其容量至少設(shè)置成事務(wù)使用的同類對象之和。線程池的配置則取決于調(diào)用模式,通用原則是:線程池的最小容量等于硬件線程數(shù)或虛擬處理器的數(shù)目,線程池的最大容量則等于硬件線程數(shù)或虛擬處理器數(shù)目的2倍。數(shù)據(jù)庫鎖策略需要根據(jù)項目工程的實際需求進行選擇并保證數(shù)據(jù)的完整性。如果應(yīng)用系統(tǒng)存在大量的訪問用戶,頻繁地訪問并更新數(shù)據(jù),那么采用悲觀鎖能獲得較好性能,避免了大量的事務(wù)回滾以及并發(fā)訪問。反之,如果數(shù)據(jù)不被并發(fā)事務(wù)頻繁地修改,則適合采用樂觀鎖[3]。

      數(shù)據(jù)持久化層的優(yōu)化工作也必須兼顧開發(fā)與生產(chǎn)運行階段,不同階段采用相應(yīng)的策略才能最大限度地獲取系統(tǒng)的優(yōu)良性能。

      2.4 JVM層

      JVM為了滿足各種應(yīng)用需要,為程序運行提供了大量配置選項,但是這些選項并非對所有的Java應(yīng)用都是最優(yōu)的,某些配置選項對某類應(yīng)用是最優(yōu)的,然而對另外一些應(yīng)用卻未必最優(yōu)。所以,JVM的配置選項有很強的針對性。在實際優(yōu)化操作過程中,需要準確獲取應(yīng)用系統(tǒng)運行時的相關(guān)變化情況,它們會對JVM的優(yōu)化產(chǎn)生直接影響。

      JVM的優(yōu)化需要全盤折衷考慮,它面臨著牽一發(fā)而動全身的情況。因此,對現(xiàn)代JVM進行調(diào)優(yōu)是一門藝術(shù)[3],往往滿足了系統(tǒng)的某個需求常常會犧牲系統(tǒng)的另一方面需求。例如減少了內(nèi)存消耗,卻影響了系統(tǒng)的吞吐量以及系統(tǒng)延遲;減少應(yīng)用程序部署使用的JVM數(shù)量又犧牲了應(yīng)用程序的可用性[3]。所以,對于不同的應(yīng)用系統(tǒng)因為側(cè)重點不同, JVM的優(yōu)化也是完全不同的。

      常規(guī)做法是針對具體的應(yīng)用系統(tǒng),根據(jù)其性能測試結(jié)果不斷優(yōu)化配置,反復進行迭代,直到這一過程取得令人滿意的指標結(jié)果為止。

      2.5 操作系統(tǒng)與網(wǎng)絡(luò)層

      對操作系統(tǒng)進行性能監(jiān)控,收集各類相關(guān)數(shù)據(jù)并進行性能分析,根據(jù)分析結(jié)果采取對應(yīng)的優(yōu)化措施。

      CPU使用率一般分為用戶態(tài)使用率和系統(tǒng)態(tài)使用率[3]。當應(yīng)用執(zhí)行操作系統(tǒng)調(diào)用的時間占總的CPU應(yīng)用時間的百分比較低時,或者操作系統(tǒng)的共享資源無競爭或低競爭、I/O設(shè)備之間的交互較少時,降低CPU系統(tǒng)態(tài)使用率,升高CPU用戶態(tài)使用率,以提高應(yīng)用系統(tǒng)性能。所以,為達到性能最佳,應(yīng)盡可能降低CPU系統(tǒng)態(tài)使用率。

      通過監(jiān)控內(nèi)存的相關(guān)屬性實時獲取該資源的消耗情況,以便采取應(yīng)對措施。例如系統(tǒng)在進行頁面交換或使用虛擬內(nèi)存時,Java應(yīng)用或JVM就會出現(xiàn)性能問題,發(fā)生磁盤與內(nèi)存之間的置換會影響應(yīng)用的響應(yīng)和吞吐量[3,15,19]。

      網(wǎng)絡(luò)I/O的性能則會影響Java應(yīng)用的性能與擴展。系統(tǒng)運行過程中的優(yōu)化必須進行網(wǎng)絡(luò)I/O監(jiān)控,通過采集的數(shù)據(jù)計算出網(wǎng)絡(luò)I/O的使用率并采取相應(yīng)措施。例如減少網(wǎng)絡(luò)讀寫的系統(tǒng)調(diào)用,減少處理請求和發(fā)送響應(yīng)的線程數(shù)以改善性能。

      3 結(jié)語

      Java應(yīng)用系統(tǒng)的性能優(yōu)化是一項貫穿于項目設(shè)計之初直至項目生命周期終結(jié)的綜合系統(tǒng)工程,需充分考慮各個層面的性能調(diào)優(yōu)以及它們之間的相互影響,并根據(jù)設(shè)計目標與需求進行平衡。前三層的優(yōu)化是應(yīng)用系統(tǒng)開發(fā)階段的重點,圍繞高效算法的設(shè)計進行,同時兼顧系統(tǒng)的恰當配置。后兩層優(yōu)化則根據(jù)應(yīng)用系統(tǒng)的實際需求與擁有的計算資源進行綜合性能調(diào)優(yōu)。在自頂向下的方法中,通過前三層的優(yōu)化設(shè)計降低后兩層的調(diào)優(yōu)難度,而后兩層的調(diào)優(yōu)則需要避免對前三層的代碼進行修改。在后續(xù)工作中,應(yīng)深入開展多層性能優(yōu)化的理論模型研究,通過創(chuàng)建模型,精確計算與評估應(yīng)用系統(tǒng)的性能優(yōu)化程度,以定量分析的形式完善應(yīng)用系統(tǒng)性能優(yōu)化。

      猜你喜歡
      線程內(nèi)存性能
      提供將近80 Gbps的帶寬性能 DisplayPort 2.0正式發(fā)布
      “春夏秋冬”的內(nèi)存
      當代陜西(2019年13期)2019-08-20 03:54:22
      淺談linux多線程協(xié)作
      Al-Se雙元置換的基于LGPS的thio-LISICON的制備與性能表征
      強韌化PBT/PC共混物的制備與性能
      中國塑料(2015年4期)2015-10-14 01:09:28
      RDX/POLY(BAMO-AMMO)基發(fā)射藥的熱分解與燃燒性能
      火炸藥學報(2014年1期)2014-03-20 13:17:29
      基于內(nèi)存的地理信息訪問技術(shù)
      Linux線程實現(xiàn)技術(shù)研究
      么移動中間件線程池并發(fā)機制優(yōu)化改進
      上網(wǎng)本為什么只有1GB?
      阿合奇县| 澄城县| 长宁县| 鄯善县| 台南县| 新密市| 邓州市| 共和县| 浑源县| 蒙城县| 桑植县| 丰镇市| 托里县| 行唐县| 东方市| 崇明县| 临邑县| 富顺县| 江华| 密云县| 夏河县| 元江| 栾川县| 衢州市| 布拖县| 黔南| 吴江市| 昭平县| 高陵县| 湘乡市| 桓台县| 甘谷县| 根河市| 平乐县| 北海市| 南川市| 嵩明县| 图木舒克市| 宁晋县| 娄底市| 台湾省|