摘 要:論述了Java虛擬機(jī)的相關(guān)技術(shù),對常用水表、電表等儀表儀器數(shù)據(jù)的采集、記錄及上報(bào)應(yīng)用方面進(jìn)行設(shè)計(jì)和研究,以此推進(jìn)儀表儀器自動化技術(shù)發(fā)展。
關(guān)鍵詞:Java虛擬機(jī);儀器儀表;數(shù)據(jù)記錄
1 JVM的特點(diǎn)
Java語言突出的一個重要特點(diǎn)是與平臺無關(guān),通過采用JVM(Java Virtual Machine)即可實(shí)現(xiàn)。JVM是一個想象中的機(jī)器,它有想象中的硬件,例如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。在實(shí)際計(jì)算機(jī)或應(yīng)用中通常通過軟件模擬來實(shí)現(xiàn),一般的高級語言如果要在不同的平臺上運(yùn)行,至少需要編譯成不同的目標(biāo)代碼。而引入Java語言虛擬機(jī)后,Java語言在不同平臺上運(yùn)行時不需要重新編譯。Java語言使用模式JVM屏蔽了與具體平臺相關(guān)的信息,使得Java語言編譯程序只需生成在JVM上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運(yùn)行。JVM在執(zhí)行字節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機(jī)器指令執(zhí)行,從而提高效率和適應(yīng)性。JVM的架構(gòu)大致如圖1所示[1-3]。

2 JVM體系結(jié)構(gòu)
通常JVM由5個主要部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)和一個方法區(qū)域。這5部分是Java虛擬機(jī)的邏輯成份,不依賴于任何實(shí)現(xiàn)技術(shù)或組織方式,但其功能必須在真實(shí)機(jī)器上以某種方式實(shí)現(xiàn)。各部分各自功能略述如下[3-6]:
2.1 Java指令集
JVM目前能支持248個字節(jié)碼,每個字節(jié)碼執(zhí)行一種基本的CPU運(yùn)算。Java指令集相當(dāng)于Java程序的匯編語言,其指令集中的每條指令包含一個單字節(jié)的操作符,用于指定要執(zhí)行的操作,還有0個或多個操作數(shù),提供操作所需的參數(shù)或數(shù)據(jù)?! ?br />
許多指令沒有操作數(shù),僅由一個單字節(jié)的操作符構(gòu)成。在JVM中內(nèi)層循環(huán)的執(zhí)行過程如下:
do{
取一個操作符字節(jié);
根據(jù)操作符的值執(zhí)行一個動作;
}while(程序未結(jié)束)
由于指令系統(tǒng)的簡單性,使虛擬機(jī)執(zhí)行的過程變得簡單,從而有利于提高執(zhí)行的效率。
2.2 寄存器
JVM的寄存器用于保存機(jī)器的運(yùn)行狀態(tài)和數(shù)據(jù),與微處理器中的部分寄存器功能類似。JVM的寄存器通常有4種:
(1)PC:Java程序計(jì)數(shù)器;
(2)optop指針:指向操作數(shù)棧頂端;
(3)frame指針:指向當(dāng)前執(zhí)行方法的執(zhí)行環(huán)境的指針;
(4)vars指針:指向當(dāng)前執(zhí)行方法的局部變量區(qū)第1個變量的指針。
2.3 棧
JVM的棧有3個區(qū)域:局部變量區(qū)、運(yùn)行環(huán)境區(qū)和操作數(shù)區(qū)。
(1)局部變量區(qū)是每個Java方法使用的固定大小的局部變量集。它們按照與vars寄存器的字偏移量來尋址。
(2)運(yùn)行環(huán)境區(qū)是在運(yùn)行環(huán)境中包含的信息用于指向當(dāng)前類和當(dāng)前方法的解釋器符號表的指針動態(tài)鏈接,采用正常的方法返回或異常傳播的方式反映運(yùn)行環(huán)境區(qū)的相關(guān)情況。
(3)操作數(shù)棧區(qū)是機(jī)器指令只從操作數(shù)棧中取操作數(shù),對它們進(jìn)行操作,并把結(jié)果返回到棧中,以此提高程序的運(yùn)行效率。
2.4 無用單元收集堆
Java的堆是一個運(yùn)行時數(shù)據(jù)區(qū),類的實(shí)例(對象)從中分配空間。Java語言具有無用單元收集能力,它不給程序員顯式釋放對象的能力。Java不規(guī)定具體使用的無用單元收集算法,可以根據(jù)系統(tǒng)的需求使用各種各樣的算法。
2.5 方法區(qū)
方法區(qū)與傳統(tǒng)語言中的編譯后代碼或是Unix進(jìn)程中的正文段類似,保存方法代碼(編譯后的Java代碼)和符號表。在當(dāng)前的Java實(shí)現(xiàn)中,方法代碼不包括在無用單元收集堆中,但計(jì)劃在將來的版本中實(shí)現(xiàn)。每個類文件包含了一個Java類或一個Java界面編譯后的代碼,可以說類文件是Java語言的執(zhí)行代碼文件。為了保證類文件的平臺無關(guān)性,Java虛擬機(jī)規(guī)范中對類文件的格式也作了詳細(xì)的說明,具體細(xì)節(jié)請參考Sun公司的Java虛擬機(jī)規(guī)范。
3 JVM在水表電表儀器自動化系統(tǒng)的設(shè)計(jì)研究
水、電是城鄉(xiāng)居民日常生活中所不可缺少的,但對水和電的管理在我國還沒有較好的自動化管理設(shè)備。特別是水、電的用量以及地域價(jià)格的差異性,導(dǎo)致相關(guān)信息不能及時上報(bào)到相關(guān)管理部門,在總結(jié)統(tǒng)計(jì)相關(guān)用水和用電數(shù)據(jù)時仍采用人工手動逐一統(tǒng)計(jì)記錄,這不僅造成效率低下,更重要的是人工手動操作難免會出現(xiàn)誤操作和誤記錄。將JVM技術(shù)應(yīng)用在水表、電表等儀表儀器的數(shù)據(jù)采集、統(tǒng)計(jì)、傳輸、記錄等自動化功能中,可以及時地統(tǒng)計(jì)每個用戶的用水、用電情況,同時,對于過度用水或用電進(jìn)行數(shù)據(jù)統(tǒng)計(jì),采取相應(yīng)的措施,防止部分家庭浪費(fèi)水電,以此加大節(jié)約用水用電的力度。
JVM在水表電表儀器自動化系統(tǒng)的系統(tǒng)架構(gòu)設(shè)計(jì)如圖2所示。

通過對JVM在水表電表儀器自動化中的設(shè)計(jì)研究,在各個居民區(qū)對水表、電表進(jìn)行改造,安裝有Java虛擬機(jī)的小型信息采集、統(tǒng)計(jì)、記錄、上報(bào)等功能的信息系統(tǒng),可以及時將相關(guān)信息進(jìn)行實(shí)時處理。同時,通過外接功能接口與通信公司建立通信機(jī)制,將信息實(shí)時發(fā)送到信息管理系統(tǒng)中心,以此對居民的用水、用電等情況進(jìn)行實(shí)時監(jiān)控。當(dāng)出現(xiàn)大額度的用量情況時,應(yīng)采取相應(yīng)措施,防止意外事故出現(xiàn)。
將Java虛擬機(jī)技術(shù)應(yīng)用在現(xiàn)代居民日常生活中,使水表、電表等儀器儀表的數(shù)據(jù)采集、匯總、記錄、上報(bào)等應(yīng)用方面,可以較大程度地減少人工手動操作。在減少因人工操作帶來的誤差的同時,提高數(shù)據(jù)統(tǒng)計(jì)及上報(bào)的效率,實(shí)現(xiàn)水表、電表等儀表設(shè)備的信息數(shù)據(jù)讀取、記錄、統(tǒng)計(jì)、上報(bào)的自動化。
參考文獻(xiàn)
[1] 夏瑋瑋,沈連豐,肖婕,等.嵌入式系統(tǒng)關(guān)鍵技術(shù)分析與開發(fā)應(yīng)用[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003(2):5-9.
[2] 劉輝,陳家駿.嵌入式JAVA虛擬機(jī)的加速改造[J].微計(jì)算機(jī)信息,2006,22(17):134-136.
[3] 齊德昱,謝景明.一個基于Java虛擬機(jī)的分布式計(jì)算模型[J]. 計(jì)算機(jī)科學(xué),2007,34(6):252-254.
[4] 袁文菊,孫天澤,李梅.Java虛擬機(jī)向ARM平臺的移植[J].微計(jì)算機(jī)信息,2007(23):92,154-155.
[5] The embedded java application environment.URL:java.sun.com/products/embeddedjava/.
[6] 宋韜,盤細(xì)平,楊春福,等.嵌入式JAVA虛擬機(jī)機(jī)制研究[J].計(jì)算機(jī)應(yīng)用與軟件,2006,07(03):62-64.
[7] 嚴(yán)忠林.從虛擬機(jī)內(nèi)部機(jī)制著手提高Java效率[J].上海師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2005,(02):42-46.
