摘 要:Java虛擬機(jī)在運(yùn)行應(yīng)用程序查詢(xún)操作時(shí),存在由于查詢(xún)結(jié)果數(shù)據(jù)量大和查詢(xún)并發(fā)性高而出現(xiàn)系統(tǒng)不穩(wěn)定的問(wèn)題。本文實(shí)現(xiàn)了一種JVM內(nèi)存使用優(yōu)化方案:恒定使用JVM內(nèi)存,在硬件成本不提高的情況下,保證了系統(tǒng)穩(wěn)定運(yùn)行。
關(guān)鍵詞:JAVA;JAVA虛擬機(jī);內(nèi)存使用優(yōu)化;穩(wěn)定性
中圖分類(lèi)號(hào):TP316.8 文獻(xiàn)標(biāo)志碼:A
An Optimization Strategy Based on The Memory Usage’s in JVM
Zhang Hong-mei
(The Computer Department of Vocation College of Bin ZhouBin Zhou256603 China)
Abstract:The unsteady question appears in java virtual computer’s query because of a great of query’records and eruptions. The text gives an excellent project of usage memory in JVM:Keeps constant in usage memory of JVM. The stability of the system is promised under that the cost of hardware does not rise.
Key Words:JAVA; JVM; Memory Usage’s Optimization;Stability
盡管現(xiàn)在內(nèi)存的性?xún)r(jià)比越來(lái)越高,但操作系統(tǒng)管理內(nèi)存的空間不是無(wú)限大的,Java虛擬機(jī)(JVM)對(duì)內(nèi)存的管理能力也是有限的[1]。在硬件配置一定的情況下,如果JVM能夠巧妙的使用有限的內(nèi)存,則可以使系統(tǒng)避免因內(nèi)存overflow而出現(xiàn)宕機(jī)的情況。
因此,對(duì)JVM的內(nèi)存使用優(yōu)化技術(shù)進(jìn)行研究將具有重要的價(jià)值。下面針對(duì)在保險(xiǎn)公司的業(yè)務(wù)查詢(xún)中曾碰到的問(wèn)題進(jìn)行分析研究,并給出了具體的解決方案。
1 JVM內(nèi)存未優(yōu)化使用出現(xiàn)的問(wèn)題
網(wǎng)絡(luò)計(jì)算機(jī)(Network Computer——NC)在金融、保險(xiǎn)、教育、電信等行業(yè)的市場(chǎng)表現(xiàn)良好,已創(chuàng)造出相當(dāng)可觀的經(jīng)濟(jì)效益和社會(huì)價(jià)值,具有很大的發(fā)展?jié)摿ΑS芍С諮ava的三層構(gòu)架[2]實(shí)現(xiàn)的NC的軟件設(shè)計(jì)如圖1所示,這種結(jié)構(gòu)已成為NC發(fā)展的必然趨勢(shì)。
NC系統(tǒng)軟件包括兩大部分:運(yùn)行在NC上的NCOS和運(yùn)行在應(yīng)用服務(wù)器上的NC Server。由圖1可以看出Java虛擬機(jī)是兩大部分的主要組件,它對(duì)內(nèi)存的管理能力將影響Java應(yīng)用程序執(zhí)行的具體效果以及NC中其他服務(wù)的性能表現(xiàn)。
1.1 宕機(jī)的出現(xiàn)
陽(yáng)光財(cái)產(chǎn)保險(xiǎn)公司的管理系統(tǒng)即采用此結(jié)構(gòu):在數(shù)據(jù)庫(kù)服務(wù)器端使用的是Sybase12.5;應(yīng)用服務(wù)器使用的是WebLogic8;網(wǎng)絡(luò)操作系統(tǒng)采用的是Linux。系統(tǒng)起初運(yùn)行時(shí)一切正常。但隨著業(yè)務(wù)量的增加,數(shù)據(jù)庫(kù)也越來(lái)越大。在一次月終總結(jié)查詢(xún)時(shí),出現(xiàn)了問(wèn)題——按險(xiǎn)種進(jìn)行本地投保金額統(tǒng)計(jì),出現(xiàn)了服務(wù)器停止響應(yīng),即宕機(jī)(shut down)。
1.2 對(duì)出現(xiàn)宕機(jī)現(xiàn)象的分析
Java程序在運(yùn)行過(guò)程中所進(jìn)行的操作是通過(guò)實(shí)例化的對(duì)象調(diào)用成員方法實(shí)現(xiàn)的,當(dāng)需要構(gòu)造對(duì)象實(shí)例時(shí),程序解釋器向操作系統(tǒng)發(fā)出內(nèi)存申請(qǐng),操作系統(tǒng)從內(nèi)存堆中預(yù)留一塊內(nèi)存空間,并使用這個(gè)空間來(lái)存儲(chǔ)對(duì)象實(shí)例變量的值。“無(wú)用單元回收”是程序中的一個(gè)實(shí)用線(xiàn)程或進(jìn)程跟蹤程序,對(duì)那些不再被使用的內(nèi)存單元進(jìn)行清理,并將釋放后的內(nèi)存單元?dú)w還操作系統(tǒng)以便復(fù)用。但是此進(jìn)程跟蹤程序只有在內(nèi)存短缺時(shí),才對(duì)“無(wú)用單元”進(jìn)行回收[3]。如果有大量的數(shù)據(jù)占用了內(nèi)存空間,而無(wú)更多的“無(wú)用單元”進(jìn)行釋放,此時(shí)再為實(shí)例化對(duì)象申請(qǐng)空間時(shí),便出現(xiàn)內(nèi)存不足的問(wèn)題,即可能出現(xiàn)由于系統(tǒng)內(nèi)存不足而導(dǎo)致系統(tǒng)運(yùn)行意外中斷等例外情況的發(fā)生。
對(duì)于結(jié)果數(shù)據(jù)量大的查詢(xún)而出現(xiàn)的宕機(jī)問(wèn)題,作了這樣的分析研究:
1)由于查詢(xún)結(jié)果的記錄首先要讀入JVM內(nèi)存,所以一個(gè)查詢(xún)操作就可能有大量的數(shù)據(jù)占用了JVM內(nèi)存。
2)在月終按某種險(xiǎn)種進(jìn)行金額匯總時(shí),在各個(gè)分枝機(jī)構(gòu)點(diǎn)都有這樣的操作,此時(shí)查詢(xún)操作的并發(fā)性高。大量的查詢(xún)結(jié)果記錄同時(shí)占用NC Server JVM所管理的內(nèi)存。
排除其它硬件問(wèn)題,出現(xiàn)系統(tǒng)shut down情況的一種最大可能是JVM使用的內(nèi)存不足。
2 JVM內(nèi)存使用優(yōu)化方案
在查詢(xún)結(jié)果數(shù)據(jù)量小且并發(fā)少的情況下,系統(tǒng)運(yùn)行是穩(wěn)定的,只有當(dāng)數(shù)據(jù)庫(kù)中記錄總數(shù)增多,查詢(xún)的結(jié)果也越來(lái)越龐大時(shí),才會(huì)出現(xiàn)上面見(jiàn)到的現(xiàn)象。所以,如果各個(gè)進(jìn)程合理使用JVM內(nèi)存,而不是長(zhǎng)時(shí)間大量占用內(nèi)存,可以解決由內(nèi)存短缺而造成的系統(tǒng)中斷問(wèn)題。
依據(jù)以上對(duì)JVM使用內(nèi)存的分析,作者經(jīng)較長(zhǎng)時(shí)間的研究與實(shí)踐,最終得出解決此問(wèn)題的一種方案——恒定使用Java虛擬機(jī)內(nèi)存。
2.1 優(yōu)化思想
恒定使用Java虛擬機(jī)內(nèi)存的思想是:客戶(hù)端通過(guò)應(yīng)用服務(wù)器對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)時(shí),不再將在數(shù)據(jù)庫(kù)中查詢(xún)到的所有記錄一次性讀入JVM內(nèi)存,然后再返回給客戶(hù)端,而是將查詢(xún)得到的部分記錄占用恒定的內(nèi)存大小,逐步組織為查詢(xún)結(jié)果文件,先暫存于應(yīng)用服務(wù)器的硬盤(pán)上,然后將壓縮的“查詢(xún)結(jié)果文件”傳輸給客戶(hù)端。
2.2 生成查詢(xún)結(jié)果文件
優(yōu)化從數(shù)據(jù)庫(kù)中查詢(xún)到的數(shù)據(jù),組織為查詢(xún)結(jié)果文件,具體操作是:每次從數(shù)據(jù)庫(kù)服務(wù)器讀取MAX行(譬如2000行)數(shù)據(jù)后,在JVM內(nèi)存中經(jīng)過(guò)簡(jiǎn)單加工,寫(xiě)入“查詢(xún)結(jié)果文件”,直到所有的結(jié)果已查出。所生成的查詢(xún)結(jié)果文件是壓縮的,目的是減少文件的大小,縮短客戶(hù)端讀取此文件時(shí)的傳輸時(shí)間。以上操作的結(jié)果是,最多只有MAX行的記錄占用JVM內(nèi)存,而其它已查到的記錄已陸續(xù)寫(xiě)入了硬盤(pán),這就保證了JVM內(nèi)存使用的大小是“恒定”的。生成查詢(xún)結(jié)果文件的主要代碼如下:
//1 取得數(shù)據(jù)庫(kù)聯(lián)接,執(zhí)行查詢(xún)SQL語(yǔ)句,得到結(jié)果集 ResultSet
Connection connection=...
Statement stmt=onnection.createStatement();
ResultSetrs=stmt.executeQuery(sql);
//2從數(shù)據(jù)庫(kù)服務(wù)器讀取數(shù)據(jù),寫(xiě)入壓縮文件
//2.1打開(kāi)壓縮文件輸出流
FileOutputStreamfileOutputStream=new FileOutputStream(fileName);
GZIPOutputStream zipOutputStream=new GZIPOutputStream(fileOutputStream);
//2.2從rs中讀取數(shù)據(jù),緩存到內(nèi)存對(duì)象buffer while (rs.next()) {
//根據(jù)需要對(duì)數(shù)據(jù)加工
buffer.append(″一行數(shù)據(jù)″);
count++;
//當(dāng)達(dá)到預(yù)定的閥值(_VALVE)時(shí),寫(xiě)入壓縮文件,釋放內(nèi)存。
if (count== _VALVE) {
// 2.2.1 寫(xiě)文件
byte[] bys=
buffer.toString().getBytes(″UTF-8″);
zipOutputStream.write(bys, 0, bys.length);
//2.2.2釋放內(nèi)存,計(jì)數(shù)器歸零
… } }
2.3 查詢(xún)結(jié)果的讀取
暫存于應(yīng)用服務(wù)器上的查詢(xún)結(jié)果壓縮文件,可直接通過(guò)http協(xié)議傳輸給客戶(hù)端,在客戶(hù)端只要解開(kāi)壓縮文件,即可顯示所查到的結(jié)果。其主要代碼如下:
//1從應(yīng)用服務(wù)器端獲取查詢(xún)結(jié)果文件
URL url=new URL(urlString);
InputStream in=url.openStream();
GZIPInputStream zipInputStream=new
GZIPInputStream(in);
InputStreamReader inputStreamReader=new InputStreamReader(zipInputStream,“UTF-8”);
BufferedReader bufReader=new
BufferedReader(inputStreamReader);
//2讀取文件內(nèi)容,展示數(shù)據(jù)
}
3 結(jié)束語(yǔ)
本文的優(yōu)化方案主要有以下3個(gè)特點(diǎn):
1)每次從數(shù)據(jù)庫(kù)服務(wù)器讀取預(yù)定的數(shù)據(jù)行到JVM內(nèi)存進(jìn)行數(shù)據(jù)加工,然后寫(xiě)入文件系統(tǒng),從而避免了由于數(shù)據(jù)量太大而導(dǎo)致JVM內(nèi)存急劇消耗。
2)生成的查詢(xún)結(jié)果文件通過(guò)壓縮文件的方式傳給客戶(hù),減小了文件大小,縮短了文件傳輸時(shí)間。
3)在系統(tǒng)硬件資源開(kāi)銷(xiāo)不增加的情況下,保證了大數(shù)據(jù)量查詢(xún)時(shí)系統(tǒng)運(yùn)行的穩(wěn)定性。
本方案在陽(yáng)光財(cái)產(chǎn)保險(xiǎn)公司計(jì)算機(jī)管理系統(tǒng)中應(yīng)用,被證明是一種解決由JVM內(nèi)存短缺引起系統(tǒng)不穩(wěn)定的切實(shí)可行的方法。
參考文獻(xiàn)
[1]朱喜福.Java程序設(shè)計(jì)[M].北京:人民郵電出版社,2006.
[2]HenryXie.J2EE經(jīng)典實(shí)例詳解[M].北京:人民郵電出版社,2003.
[3]王克宏,郝建文.Java 技術(shù)教程[M].北京:清華大學(xué)出版社,2002.
[4]呂鳳翥.Java語(yǔ)言程序設(shè)[M].北京:清華大學(xué)出版社,2007.
[5]李超燕.數(shù)據(jù)庫(kù)原理及應(yīng)用教程[M].北京:科學(xué)出版社,2004.