Java用於嵌入式系統的侷限

才智咖 人氣:1.49W

java語言的諸多優點在某些情況下恰恰可能成為其不利於在嵌入式系統中得以廣泛應用的絆腳石。本站小編下面為你整理了關於Java用於嵌入式系統的侷限,希望對你有所幫助。

Java用於嵌入式系統的侷限

侷限1:效能較低

由於解釋Java位元組碼比相當的C或C++寫的程式執行起來要慢5到10倍,對一些並非受制於CPU的嵌入系統來說,這一效能缺點不是問題,但是更經常的較慢的速度會導致無法接受的應答時間。

解決方案

有幾種可能的解決方案可緩解速度慢的問題。

使用更快、更強大的處理器,使系統響應時間縮小到可以接受的範圍。不過這個方法將增加每個系統的成本。

使用母語Java編譯器來獲得比較好的效能。但這樣做,就放棄了與Java平臺無關的優點,好在大多數嵌入系統都只在一種平臺上執行。

在系統上併入一個JIT編譯器,這樣Java類裝入時就被編譯。不過,如果為接納JIT編譯器而不得不增加額外的記憶體,這個方法也會增加系統成本。另外,若系統各部分是按需求逐漸新增,則應該控制程式裝入的時機,以使在裝入類進行編譯時產生的暫停不會影響系統的響應時間。

侷限2:垃圾收集的系統開銷過大

Java中的自動記憶體分配和垃圾收集效能是很實惠的,但是,從實時系統的角度來看,它的問題恰好就在於它是自動的。當垃圾收集進行時,開發者對系統的控制就受限了。因為,垃圾收集執行時,它凍結了系統其餘部分的處理。這是因為它必須要在記憶體中移動物件,並必須在程式再次執行前,更新所有引用(指向)那些物件的程式變數。垃圾收集需要凍結處理的時間,具體取決於記憶體量和處理器的速度。很顯然,這對硬實時系統是無法接受的,甚至極端時對軟實時系統也是成問題的。

解決方案

垃圾收集以三種方式開啟。首先JVM有一個後臺垃圾收集執行緒,此執行緒傾向於在它一看見系統有空閒就開始垃圾收集,若有事件想要喚醒另一個執行緒,後臺垃圾收集就會被該執行緒佔先,但它不會立刻被佔先,它得更新那些已被移動的物件的所有引用後,才能讓一個執行緒執行。其次,若JVM沒找到足夠記憶體來滿足某個記憶體分配請求,它將啟動一個不會被佔先的垃圾收集,在該操作完成之前,系統的其餘部分被禁止。最後,一個應用程式能通過呼叫()方法來啟動垃圾收集。所以,如果知道系統暫時不會執行任何時序上關鍵的.任務,就可以啟動垃圾收集,避免稍後在更關鍵時段進行收集。

侷限3:JVM的記憶體開銷過大

前面我們也論述了許多 JVM的內建特點,比如圖形和網路,它們使得Java程式更快上市。所有這些特點的負面是JVM的記憶體開銷。因為JVM是一個整塊(要達到Java的可移植的目的,必須完整的採納),JVM的記憶體佔用量不能減少。現在的JVM最少需要2MB以上的記憶體。

解決方案

如果Java程式也在使用一些消耗記憶體的功能,由於一個JVM中有那麼多的功能,各個Java應用程式就能寫得小一點。如果建立的是一個從網路上動態下載並執行多個程式的系統,那麼這將是個很大的優點。但Java仍然不具備可配置性和可伸縮性。

侷限4:缺乏直接硬體介面能力

Java缺乏直接同硬體介面的能力。JVM僅僅是一個虛擬的機器,一個對硬體的軟體抽象,虛擬機器控制與實際硬體的介面,而我們只能和虛擬機器打交道。

解決方案

但這並非是無法逾越的限制,很多C程式使用內嵌彙編來規避效能上的瓶頸,所以Java程式也能使用C來獲得對硬體的直接訪問。

讓Java和C一起工作有兩種方式。首先,可以使用本地方式,它們是用C/C++或另一種語言寫的,但當呼叫時,則裝入與JVM同樣的記憶體空間,運行於同樣的環境。因為它們被編譯成機器碼,本地方式執行更快並能直接訪問硬體。本地過程與Java程式碼之間通過套接來彼此交流,就像網路中通訊端點使用的套接一樣。不過在選擇了混合語言方法後,Java的與平臺無關和安全特點就沒有了。

另外,可以考慮將前面提到的Java處理器作為軟體JVM的直譯器部分作為一種硬體實現方案。Java程式能在這些處理器上直接執行並操縱硬體,要注意的是必需加一些特殊目的的指令給這種語言才能直接與處理器一起工作。

侷限5:語言尚不夠成熟

從標準的程式設計語言角度來看,Java還很年輕,也很粗糙。如果Java不是由一個小組開發的,也許某些錯誤和疏忽已經被發現和解決了。在Java亮相以後,它立即被用於比原來預期更多的地方。這一切都意味著Java最初的構思和實現,雖然堅實和有用,但在安全、大小和效能幾方面仍感欠缺。

在其進一步發展中,Sun公司分了三個步驟來促進Java成為一種通用語言和計算機平臺。首先,用Java程式設計實現現存的商業和企業的一些功能活動,諸如電子郵件、日曆和字處理程式。其次,把Java提供給企業,使它成為一種編寫內部應用程式的方法。最後一步,是為傳統嵌入式裝置應用,比如為行動電話、機頂盒以及印表機定義Java API以及語言功能。

由此可見,Java的嵌入式應用是排在Sun公司日程的最後的,Sun公司在繼續為這些用途發展此語言,但對這方面的發展次於桌面及企業用途。按Sun公司的優先順序,很可能還要過一段時間才能解決嵌入式應用中涉及到的一些問題。在此之前,嵌入式系統的程式設計人員可能不得不迂迴、妥協以及使用第三方解決方案。

Java開發的程式設計工具也仍在發展之中。有幾個廠家提供編譯器和開發工具,如Symantec、Microsoft以及Sun公司。Sun不再是JVM和JIT的惟一供應商,其他幾個供應商的產品也很有競爭力。Parasoft公司的Jtest軟體自動為Java模組生成檢測案例,而Numega公司的Jcheck為JVM中的程式行為提供一定的可見性。不過兩者都只能處理除錯程式中的一小部分,而且都是針對桌面系統開發設計的,雖然它們也能用於嵌入開發過程。

目前Java仍然沒有交叉除錯解決方案,即那種傳統上被嵌入系統開發者用來處理目標平臺上程式的方案,所以很可能必須用C/C++來寫程式中針對硬體的部分。不管怎樣,開發者最好用一個C/C++互動偵錯程式來除錯那些程式碼,並在目標系統上用彈出對話方塊,保持記錄檔案,或其他類技巧來除錯Java.