王曉亮
摘要:Java虛擬機在運行Java應用程序的查詢操作時,存在由于查詢結果數據量大和查詢并發性高而出現系統不穩定的問題。提出了一種JVM內存使用優化方案:恒定使用JVM內存,能夠在不提高硬件成本的情況下,保證系統連續穩定地運行。
Abstract: The system instability problem appears on large amount of query result data volume and high query concurrency when JVM is running a Java application query operation. A JVM memory use optimization scheme is proposed: use the JVM memory constantly, it can ensure system continuous steady operation without the increase the hardware cost.
關鍵詞:JAVA;JAVA虛擬機;內存使用優化;穩定性
Key words: JAVA;JVM;use optimization of memory;stability
中圖分類號:TP31 文獻標識碼:A 文章編號:1006-4311(2017)21-0221-02
0 引言
基于Java的應用程序實際運行過程中,因為其語言自身所具備的特點以及虛擬機等方面的影響,其相應客戶端硬件配置的實際要求要比VC++和VB語言編寫的程序高出許多。盡管Java 2對于JDK虛擬機解釋器實施了優化處理,但并不能夠達到是用戶的某些要求。所以,Java程序的開發人員在對程序代碼優化過程中,比較注重它的運行性能。其實,Java運行程序能夠從依靠其他方面進行相應的優化,即對程序所占用內存空間進行管理優化。很多功能復雜的Java應用程序在運行時因為系統頻繁針對內存進行存儲文件操作,所以極大的降低了軟件實際運行性能。程序中存在的內存漏洞造成了程序通過操作系統消耗內存,而沒有及時進行對內存空間的復用和釋放,致使程序消耗相應的內存空間越來越大。
衡量Java程序內存行為的一項重要指標就是內存分配速率,它的含義是指在單位時間內分配給運行程序內存容量。在計算該指標數據時一般情況下不包括收集內存垃圾所占用的時間。一個程序在其運行的時候會連續產生多個對象,這就同時需要有相應的回收垃圾對象的內存垃圾回收程序,而內存垃圾產生的速度快慢也對Java程序的內存運行效率有很大的影響。Java程序運行的基本流程是首先分配程序運行所需的內存,當在程序運行過程中出現堆空間不夠這種情況時,就會進行垃圾對象的回收。當垃圾對象回收完成后,當前可用內存容量就會恢復到一個數量,這個數量的內存容量是當前正在運行的Java程序存儲其運行所需的數據結構所需要占用的內容容量,也是其工作時需要占用的基本內容空間,該內存空間可以稱為工作內存。工作內存空間數量的變化同時也能夠反映出來Java程序運行所需的數據結構所占用的內存容量的變化情況。
盡管現在內存的性價比越來越高,但OS管理內存的空間不是無限大的,JVM對內存的管理能力也是有限的。由SUN公司提供的JVM內存使用空間資料如表1所示。在硬件配置一定的情況下,如果JVM能夠巧妙的使用有限的內存,則可以使系統避免因內存overflow而出現當機的情況。
■
因此,對JVM的內存使用優化技術進行研究將具有重要的價值。下面針對在某公司的業務查詢中出現的問題進行分析研究,并給出具體的解決方案。
1 JVM內存使用未優化出現的問題
網絡計算機(Network Computer:NC)在教育、電信、保險、金融等行業的市場表現良好,已創造出相當可觀的經濟效益和社會價值,具有很大的發展潛力。由支持Java的三層構架實現的NC的軟件設計如圖1所示,這種結構已成為NC發展的必然趨勢[2]。
NC系統軟件包括兩大部分:運行在NC上的NCOS和運行在應用服務器上的NC Server。由圖1可以看出Java虛擬機(Java Virtual Machine-JVM)是兩大部分的主要組件,它對內存的管理能力將影響Java應用程序執行的具體效果以及NC中其他服務的性能表現。
1.1 當機的出現
某公司管理系統采用結構情況:在數據庫服務器端使用的是Sybase12.5,應用服務器使用的是Web Logic8,網絡操作系統采用的是Linux。系統起初運行時一切正常,因為該公司是一家省級公司,在各地市都有分支機構,所以隨著業務量的增加,數據庫也越來越大。在一次月終總結查詢時,需要查詢結果記錄量很大,這時出現了服務器停止響應的當機故障。
1.2 對出現當機問題的分析
Java程序在運行時處理內存短缺問題方面的解決方案通常是使用Java語言提供的無用內存單元回收功能(又稱為垃圾回收功能)。程序在運行過程中需要構造對象實例,這時程序解釋器向操作系統發出內存申請,操作系統從內存堆中預留一塊內存空間,并使用這個空間來存儲對象實例變量的值。在程序運行過程中對象、變量和方法的構造都會占用一定的內存空間。而某些變量或對象在完成了一次或幾次調用后不會繼續被程序所使用。“無用單元回收”這一概念的含義就是程序中一個實用線程或進程跟蹤程序,對那些不再被使用的內存單元進行清理,并將釋放后的內存單元歸還操作系統或程序以便復用。但是此進程跟蹤程序只有其內存不足時,才開始對“無用單元”實施回收。倘若其內存存在著大量的數據,但其“無用單元”得不到一定的釋放時,則會導致內存不足的現象發生。進而致使系統在工作時意外中斷等一系列情況產生[3]。
對于上面出現的問題,我們作了這樣的研究分析:
①由于查詢結果的記錄首先要讀入JVM內存,所以一個查詢操作就有可能有大量的數據占用了JVM內存。
②在月終按分類進行金額的匯總時,在各個分支機構點都有這樣的操作,此時查詢操作的并發性高。大量的查詢結果記錄同時占用JVM所管理的內存。排除其它硬件問題,出現系統中斷情況的一種可能是JVM使用的內存不足。
2 JVM內存使用優化方案
系統在查詢結果數據量小且并發查詢少的情況下,系統運行是穩定的;只有當數據庫中記錄總數增多,查詢的結果也越來越龐大時,才會出現上面見到的現象。所以,如果各個進程合理使用JVM內存,而不是長時間大量占用內存,可以解決由內存短缺而造成的系統中斷問題[4]。
依據以上對JVM使用內存的分析,提出解決此問題的一種方案:恒定使用Java虛擬機內存。
2.1 優化思路
恒定使用Java虛擬機內存方案的優化思路是:客戶端借由應用服務器進而查詢所對應的數據庫時,并不是把其所查出的數據記錄一次性讀入JVM內存,進而再返回客戶端,實際上是將所查詢出來的結果組織為查詢結果文件,先將其暫存于應用服務器相應硬盤上,然后將壓縮的“查詢結果文件”傳送到客戶端。
2.2 生成查詢結果文件
將從數據庫所查得出的所有數據,組織為一個查詢結果文件,其實際操作如下:每次從數據庫服務器讀取MAX行(該數據是一個試驗值,具體值依賴于應用服務器性能配置和并發訪問量)數據后,在JVM內存中經過簡單加工,寫入“查詢結果文件”,直至得出全部的結果。所得出的查詢結果文件是以壓縮形式發出的,可以使其文件變小,進而有效減少客戶端讀取此文件時的所實際消耗的時間。總而言之,最多只有MAX行的記錄占用JVM內存,而其它已查到的記錄陸續寫入了硬盤,這就保證了JVM內存使用的大小是“恒定”的。對于暫存于硬盤上的壓縮文件可以設置定期刪除,避免占用大量應用服務器硬盤空間[5]。
該步驟主要完成的工作流程:每次首先從數據庫查詢記錄行數的最大值,建立與數據庫的連接,執行相應的SQL查詢語句,形成查詢RS結果集合。從數據庫服務器查詢數據,并將查詢結果形成壓縮文件。打開壓縮文件輸出流,從RS中讀取數據,緩存到buffer內存對象,根據需要對數據進行處理,當數量達到預定的閥值時,寫入壓縮文件,釋放內存,同時將計數器清零。向客戶端返回查詢結果文件的地址,輸出剩余數據,最后關閉數據庫文件。
2.3 查詢結果的讀取
暫存于應用服務器上查詢結果壓縮文件,可直接通過http協議傳輸給客戶端,在客戶端僅僅需要將壓縮文件進行解壓操作,就能夠得到所需結果。流程包括:首先從從應用服務器端查詢獲取結果壓縮文件到客戶端,然后在客戶端完成壓縮文件的解壓縮,并將結果數據展示出來。
3 結束語
提出的優化方案主要有以下3個特點:
①每次從數據庫服務器讀取預定的數據行到JVM進行數據加工,然后寫入文件系統,從而避免了由于數據量太大而導致JVM內存急劇消耗。
②生成的查詢結果文件通過壓縮文件的方式傳給客戶,減小了文件大小,縮短了文件傳輸時間。
③在系統硬件資源開銷不增加的情況下,保證了大數據量查詢時系統的穩定性。
優化方案經過實際應用,被證明是一種解決由JVM內存短缺引起系統不穩定的切實可行的方法。
參考文獻:
[1]VENNERS B. Inside the Java Virtual Machine[M]. New York McCraw-Hill,2000:27-98.
[2]LINDOLM T YELLIN F. The Java Virtual Machine specification [M]. Boston, MA: Addison Wesley,1999, 21(104).
[3]徐鵬,王克宏.Java程序內存空間優化策略的研究[J].計算機科學,2002,29(4):24-27.
[4]曹曉鋼,蔣靖譯.Bill Venners.深入Java虛擬機[M].北京:機械工業出版社,2003.
[5]楊麗潔.基于Linux網絡計算機Java虛擬機的性能優化[J].計算機工程,2007,33(3):53-55.