文章詳情頁
實(shí)時(shí)JAVA簡(jiǎn)介
瀏覽:114日期:2024-06-06 10:47:40
內(nèi)容: 我在一家投資銀行工作了許多年 , 我的經(jīng)驗(yàn)告訴我,在金融軟件中出現(xiàn)的絕大多數(shù)問題是由于缺少實(shí)時(shí)支持導(dǎo)致的。許多大型的金融IT系統(tǒng)工作于JAVA平臺(tái),程序運(yùn)行時(shí)一個(gè)不在計(jì)劃中的的兩秒的垃圾收集將導(dǎo)致成千上萬美元的損失。更糟糕的是,垃圾收集通常發(fā)生在程序負(fù)載很高的情況下,這時(shí)候程序?qū)?zhí)行過程中的中斷更為敏感。同樣的情況也發(fā)生在其他高科技產(chǎn)業(yè)中,這就是為什么需要仔細(xì)研究實(shí)時(shí)JAVA規(guī)范及其實(shí)現(xiàn)的原因。有些人可能會(huì)認(rèn)為JAVA和實(shí)時(shí)是不同環(huán)境中的兩個(gè)概念,實(shí)際上,最老的JSR之一(確切的說是第一個(gè)JSR)就是關(guān)于擴(kuò)展JAVA平臺(tái)的實(shí)時(shí)特性的。然而,任務(wù)提交的順序并不保證它的實(shí)現(xiàn)的順序;Sun只是在最近才實(shí)現(xiàn)了實(shí)時(shí)性,但這并不意味著它是一個(gè)低優(yōu)先級(jí)的特性;實(shí)際上,這是一個(gè)非常復(fù)雜并且是一個(gè)完整的工作。但是實(shí)時(shí)的要求與JAVA的本身的要求兼容嗎?有很多問題就不得不提了,如GC的語義學(xué) ,同步,線程調(diào)度以及high-resolution的時(shí)間管理。在本文中,我們將逐一解釋這些名詞。版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必保留以下作者信息和鏈接作者:michaelzyy;michaelzyy原文:http://www.matrix.org.cn/resource/article/2006-11-28/JAVA+Real+Time_72f1a994-7e38-11db-babc-9753a314dd4b.html關(guān)鍵字:Java;Real time實(shí)時(shí)是什么意思呢?Greg Bollella ,是Sun公司的一個(gè)杰出的工程師,實(shí)時(shí)JAVA規(guī)范的作者之一,它說,實(shí)時(shí)意味著“能夠可靠的可預(yù)測(cè)的推測(cè)和控制程序邏輯的時(shí)間行為的能力。實(shí)時(shí)并不像許多開發(fā)者想的那樣,意味著速度,而是意味著當(dāng)需要對(duì)現(xiàn)實(shí)世界的事件作出反應(yīng)時(shí),它的行為是可預(yù)測(cè)的和可靠的。實(shí)時(shí)的電腦總是在限定的期限之內(nèi)作出反應(yīng)。取決與所設(shè)定的的期限,大量的系統(tǒng)可以被稱作是實(shí)時(shí)的。很多程序不能允許即使是一秒的延遲;他們包括之前提到的金融軟件,飛機(jī)控制軟件,核電站控制軟件等等。所以,這些并不完全是對(duì)速度要求很高的,盡管實(shí)時(shí)平臺(tái)的設(shè)計(jì)師會(huì)努力使得程序變快。顯而易見,標(biāo)準(zhǔn)的JAVA平臺(tái)并不符合這些實(shí)時(shí)系統(tǒng)的要求,這也寫入了J2SE和J2EE的許可證協(xié)議中,這些協(xié)議明確的聲明JAVA不能用于核電站設(shè)施軟件和防衛(wèi)系統(tǒng)等等。實(shí)時(shí)JAVA開發(fā)實(shí)時(shí)應(yīng)用程序需要一個(gè)能夠允許開發(fā)者正確的控制程序的運(yùn)行時(shí)間以及程序在現(xiàn)實(shí)中的行為PI集合和語義。因此JAVA的實(shí)時(shí)版本必須提供一些JVM的增強(qiáng)以及一個(gè)適合實(shí)時(shí)程序的API集合。毫不奇怪,在JAVA中添加實(shí)時(shí)的特性最大的障礙在于它的垃圾收集器。Sun最近發(fā)布的JAVA實(shí)時(shí)版本RTS1.0中就包含了一個(gè)革命性的核心的實(shí)時(shí)的垃圾收集器。盡管它的第一個(gè)實(shí)現(xiàn)中并沒有包含這樣一個(gè)垃圾收集器(將在下一個(gè)release版本中將增加)。JAVA RTS 提出了其他一些問題,保證線程調(diào)度的確定性,overhead同步,鎖排隊(duì)管理,類初始化以及最少的中斷反應(yīng)延遲。JAVA RTS僅僅針對(duì)于合適的操作系統(tǒng),這就意味著只有諸如QNX這樣的的實(shí)時(shí)操作系統(tǒng)才適合去實(shí)現(xiàn)一個(gè)這樣的JVM。實(shí)時(shí)JAVA規(guī)范的第一個(gè)官方商業(yè)實(shí)現(xiàn)版本是在Solaris 10,工作在UltraSparc硬件上,并且要求J2SE 1.4.2作為基礎(chǔ)。未來的版本將會(huì)支持JAVA 5 以及其他的一些平臺(tái)。美國海軍,Raytheon公司和波音公司已經(jīng)開始使用SUN的JAVA實(shí)時(shí)系統(tǒng)。當(dāng)然,SUN的JAVA實(shí)時(shí)系統(tǒng)并不是第一個(gè)實(shí)時(shí)JAVA的實(shí)現(xiàn)。一些嵌入式系統(tǒng)的廠商已經(jīng)在他們的系統(tǒng)中實(shí)現(xiàn)了一些實(shí)時(shí)的特性,不過他們的實(shí)現(xiàn)只是涵蓋了一些具體的需要,并不符合JSR-1規(guī)范的要求。這對(duì)于那些使用JAVA平臺(tái)并需要實(shí)時(shí)JVM的開發(fā)人員來說是個(gè)好消息。這些聽起來都不錯(cuò),可是從一個(gè)開發(fā)人員的角度來看,這又意味著什么呢?要改變現(xiàn)有的程序使其使用RTS的API需要些什么改變呢?我們可以擺脫垃圾收集導(dǎo)致的中斷這樣一個(gè)主要的問題嗎?很不幸,所有的一切并不是那么簡(jiǎn)單。僅僅簡(jiǎn)單的安裝一個(gè)RTS的擴(kuò)展包,把java.lang.Thread實(shí)例改名交javax.realtime.RealtimeThread并不能把一個(gè)程序變成一個(gè)實(shí)時(shí)的應(yīng)用程序。不過,這仍然是一個(gè)很好的開端,至少你可以獲得一個(gè)革命性的實(shí)時(shí)的垃圾收集器。不得不提的是現(xiàn)有的J2SE的程序?qū)⒖梢猿晒Φ脑贘AVA 實(shí)時(shí)系統(tǒng)下運(yùn)行 因?yàn)镽TSJ規(guī)范只是JAVA語言規(guī)范和JAVA虛擬機(jī)規(guī)范的一個(gè)子集。它并不允許那些可能會(huì)破壞現(xiàn)有程序的語義擴(kuò)展。為了使得實(shí)時(shí)的垃圾收集器可預(yù)測(cè),程序員必須了解它的程序是如何從堆中要求內(nèi)存的,因?yàn)槔占骱统绦蚨家玫剿3绦虍a(chǎn)生垃圾,然后垃圾收集器將垃圾清理成空閑的內(nèi)存,它們需要在堆中進(jìn)行。因此,你必須告訴垃圾收集器關(guān)于你的程序產(chǎn)生垃圾的速度等一些信息,這樣它可以明白自己需要多快的進(jìn)行垃圾收集。如何獲取那些數(shù)字可能是有點(diǎn)tricky,但是不管你做什么,你必須得考慮內(nèi)存的使用。如果運(yùn)行RealtimeThread不是足夠的,在修改完大罵之后,垃圾收集器的停頓將仍然很長或者無法預(yù)測(cè)。你可能需要使用一個(gè)execution context而不是RealtimeThread,例如javax.realtime.NoHeapRealtimeThread.它可以通過使用內(nèi)存而不是JAVA堆來獲得可預(yù)測(cè)的特性,例如immortal memory 和 scoped memory,后面我們將討論他們。獲得可預(yù)測(cè)性當(dāng)然需要代價(jià)的:典型的情況是犧牲了系統(tǒng)的平均性能。JAVA RTS的新特性讓我們來看一下JAVA RTS平臺(tái)中增加了哪些新特性。 *直接內(nèi)存存取.JAVA RTS 允許對(duì)物理內(nèi)存的直接存取,這與J2ME很像。不要驚奇,JAVA實(shí)時(shí)系統(tǒng)主要針對(duì)的平臺(tái)就是嵌入式系統(tǒng)。這就意味著現(xiàn)在你可以創(chuàng)建用純JAVA寫的設(shè)備驅(qū)動(dòng)了。盡管內(nèi)存存取并不是一個(gè)實(shí)時(shí)系統(tǒng)的直接要求,許多應(yīng)用程序還是需要對(duì)物理內(nèi)存做存取。JAVA RST定義了一個(gè)新的類,這個(gè)類允許程序員對(duì)物理內(nèi)存做字節(jié)級(jí)別的存取,同時(shí)這個(gè)類還允許在物理內(nèi)存中創(chuàng)建對(duì)象。有人可能會(huì)認(rèn)為JAVA支持物理內(nèi)存存取就是放棄了原有的主要的原則-可靠性和安全性,并向C語言又靠近了一步。但這并不是問題的所在,JAVA通過控制內(nèi)存邊界和數(shù)據(jù)內(nèi)容來實(shí)現(xiàn)了一個(gè)強(qiáng)大的安全保護(hù)措施。 *異步交流。JAVA RTS 提供了兩種異步交流的形式:異步事件處理和異步傳輸控制。異步事件處理意味這開發(fā)者可以計(jì)劃對(duì)來自JVM外部的事件的反應(yīng)。異步傳輸控制為一個(gè)線程提供了安全的中斷另一個(gè)線程的方法。 *High-resolution timing.有很多詳細(xì)描述High-resolution timing的方法,包括絕對(duì)時(shí)間和相對(duì)時(shí)間。時(shí)間的調(diào)度和度量能夠具有一個(gè)納秒級(jí)準(zhǔn)確度。 *內(nèi)存管理。有兩種新的內(nèi)存區(qū)域可以幫助防止由于在實(shí)時(shí)應(yīng)用程序中傳統(tǒng)的垃圾回收導(dǎo)致的無法預(yù)期的延遲。Immortal memory 和 scoped memory。Immortal memory保存對(duì)象而不摧毀他們,直到程序結(jié)束。這就意味著在Immortal memory中創(chuàng)建的對(duì)象必須像C 程序那樣仔細(xì)的分配和管理。scoped memory僅僅被用于當(dāng)一個(gè)進(jìn)程在一個(gè)特定的范圍里工作的情形。當(dāng)這個(gè)進(jìn)程離開這個(gè)范圍的時(shí)候,對(duì)象將自動(dòng)被摧毀。Immortal memory和scoped memory都不會(huì)被垃圾收集的,因此可以通過使用它們來避免垃圾收集的影響。JAVA RTS也為使用內(nèi)存區(qū)域的線程提供了內(nèi)存分配預(yù)算的功能的有限支持。當(dāng)線程被創(chuàng)建的時(shí)候,每個(gè)實(shí)時(shí)線程的最大內(nèi)存區(qū)域消費(fèi)和最大的分配率可以是指定的。 *實(shí)時(shí)線程。正如先前所提到的,JAVA RT支持兩種新的線程模型:實(shí)時(shí)線程(javax.realtime.RealtimeThread) 和非堆實(shí)時(shí)線程(javax.realtime.NoHeapRealtimeThread).這兩種線程類型都是不能被垃圾收集中斷的。這些線程具有28個(gè)級(jí)別的優(yōu)先級(jí),并且和標(biāo)準(zhǔn)的JAVA不同,他們的優(yōu)先級(jí)是嚴(yán)格的增強(qiáng)的。實(shí)時(shí)線程是同步的,并且并不受限于所謂的優(yōu)先級(jí)顛倒(priority inversion),在這種priority inversion情況下,如果一個(gè)低優(yōu)先級(jí)的線程擁有一個(gè)高優(yōu)先級(jí)的線程所需要的資源,將會(huì)阻止了這個(gè)高優(yōu)先級(jí)的線程的運(yùn)行。測(cè)試證明JAVA RTS完全避免了priority inversion,這對(duì)于緊急任務(wù)來說是很重要的。 它是如何工作的讓我們先簡(jiǎn)短的了解程序員可以多么輕易的利用這些實(shí)時(shí)JAVA的新特性的。我們將只考慮新的API中的最有趣的部分:線程和內(nèi)存。對(duì)于其他問題,請(qǐng)參閱real-time JAVA specification 文檔(PDF).規(guī)范的制訂者們一個(gè)主要的目標(biāo)就是保證RTS編程的簡(jiǎn)單性,盡管實(shí)時(shí)問題是很復(fù)雜的;這就意味著操作系統(tǒng)必須盡可能多的完成一些工作,使得程序員只需要完成實(shí)時(shí)程序設(shè)計(jì)這個(gè)具有挑戰(zhàn)性的工作。線程RealtimeThread 類繼承了java.lang.Thread類。這個(gè)類有多個(gè)構(gòu)造函數(shù),開發(fā)者能夠調(diào)試線程的行為。public RealtimeThread()public RealtimeThread(SchedulingParameters scheduling)public RealtimeThread(SchedulingParameters scheduling, ReleaseParameters release)提供給RealtimeThread(還有MemoryParameters )的構(gòu)造函數(shù)的兩個(gè)參數(shù)ReleaseParameters 和SchedulingParameters使得線程的時(shí)間和處理器需求可以通知給系統(tǒng)。RealtimeThread實(shí)現(xiàn)了Schedulable接口。關(guān)鍵就在于Schedulable對(duì)象可以被放置在ImmortalMemory, HeapMemory, ScopedPhysicalMemory, and PhysicalImmortal等類的實(shí)例所表示的內(nèi)存中。NoHeapRealtimeThread 是RealtimeThread的一個(gè)特有的形式。因?yàn)镹oHeapRealtimeThread實(shí)例可以立刻搶占任何已實(shí)現(xiàn)的垃圾收集器,它的run()函數(shù)中的邏輯不允許分配或引用任何在堆中分配的對(duì)象,或者是對(duì)在堆中的對(duì)象進(jìn)行操作。例如,如果A和B是immortal memory中的兩個(gè)對(duì)象。B.p是堆中的一個(gè)對(duì)象的引用 , A.p和B.p的類型是一致的,那么NoHeapRealtimeThread是不允許執(zhí)行與下面類似的代碼的:A.p = B.p;B.p = null;考慮到這些限制,NoHeapRealtimeThread對(duì)象必須被放置在一個(gè)內(nèi)存區(qū)域中以防止線程可能unexceptionally的控制實(shí)例的變量。這就是為什么NoHeapRealtimeThread的構(gòu)造函數(shù)要求ScopedMemory 或 ImmortalMemory的引用了。當(dāng)線程啟動(dòng)后,所有的操作都處于分配的內(nèi)存區(qū)域中。因此,new操作產(chǎn)生的所有的內(nèi)存分配都處于這個(gè)區(qū)域中。內(nèi)存管理我們已經(jīng)發(fā)現(xiàn)了一些內(nèi)存相關(guān)的類了。更確切的說,MemoryArea 是所有處理可分配的內(nèi)存區(qū)域的類的抽象的基類,這些內(nèi)存區(qū)域包括ImmortalMemory,物理內(nèi)存和ScopedMemory。HeapMemory類是一個(gè)單體(singleton)對(duì)象,它允許其他內(nèi)存區(qū)域中的代碼在JAVA堆中分配內(nèi)存。這個(gè)方法返回一個(gè)對(duì)HeapMemory單體實(shí)例所代表的JAVA堆的指針。public static HeapMemory instance() 更有意思的是ImmortalMemory類,這是一個(gè)所有線程都共享的內(nèi)存資源。在ImmortalMemory中分配的對(duì)象一直會(huì)存活到程序結(jié)束的時(shí)候,并且絕不會(huì)被垃圾收集掉,盡管一些垃圾收集算法可能會(huì)要求掃描Immortal MemoryScopedMemory區(qū)域連接到特定內(nèi)存區(qū)域,這是一個(gè)處理那些指向具有有限生命周期的內(nèi)存空間的類RawMemoryAccess實(shí)例把一段范圍的物理內(nèi)存當(dāng)作一個(gè)固定順序的字節(jié)。Accessor方法的完整實(shí)現(xiàn)將允許通過偏移量來訪問物理地址的內(nèi)容,把它解析成byte,short,int或long數(shù)據(jù)或者這些類型的數(shù)組。如果你需要訪問float或是double類型的值,就必須使用RawMemoryFloatAccess類。偏移量是代表high-order 還是 low-order字節(jié)取決于RealtimeSystem類中的靜態(tài)布爾變量BYTE_ORDER的值。一個(gè)raw的內(nèi)存空間當(dāng)然不能夠存儲(chǔ)JAVA對(duì)象的引用,因?yàn)檫@樣一種操作是不安全的。RawMemoryAccess類用下面的構(gòu)造函數(shù)來初始化:public RawMemoryAccess(JAVA.lang.Object type,long base, long size) throws SecurityException, OffsetOutOfBoundsException, SizeOutOfBoundsException, UnsupportedPhysicalMemoryException, MemoryTypeConflictException, MemoryInUseException值得注意的是這個(gè)構(gòu)造函數(shù)定義了相當(dāng)多的可能拋出的異常。Type參數(shù)是代表所需內(nèi)存類型的對(duì)象所需要的。它被用于定義初始地址以及控制映射。結(jié)論實(shí)時(shí)JAVA提供了一個(gè)更可靠和可預(yù)測(cè)的調(diào)度機(jī)制,內(nèi)存處理方法,各種不同的內(nèi)存模型,一個(gè)可預(yù)測(cè)性更好的線程和同步模型,異步時(shí)間處理,以及high-resolution時(shí)間處理。這使得可預(yù)測(cè)的運(yùn)行成為傳統(tǒng)的計(jì)算性能測(cè)試中所有決定中的第一選擇。這就是實(shí)時(shí)的真諦。這篇文章只是一個(gè)新的概念和Sun的JAVA實(shí)現(xiàn)的的綜述。如果你對(duì)具體的實(shí)現(xiàn)細(xì)節(jié)很感興趣,你可以在下面的資源中找到很多有用的資料。實(shí)時(shí)JAVA為JAVA應(yīng)用程序提供了實(shí)時(shí)能力,這也使得JAVA有可能成為第一個(gè)可用的商業(yè)的實(shí)時(shí)語言。資源 * Real-Time JAVA Platform Programming, by Peter C. Dibble * Real-Time Specification for JAVA (PDF) * Sun J2SE Real-Time EditionPeter Mikhalenko是Deutsche Bank的一個(gè)商務(wù)顧問。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 我在一家投資銀行工作了許多年 , 我的經(jīng)驗(yàn)告訴我,在金融軟件中出現(xiàn)的絕大多數(shù)問題是由于缺少實(shí)時(shí)支持導(dǎo)致的。許多大型的金融IT系統(tǒng)工作于JAVA平臺(tái),程序運(yùn)行時(shí)一個(gè)不在計(jì)劃中的的兩秒的垃圾收集將導(dǎo)致成千上萬美元的損失。更糟糕的是,垃圾收集通常發(fā)生在程序負(fù)載很高的情況下,這時(shí)候程序?qū)?zhí)行過程中的中斷更為敏感。同樣的情況?
標(biāo)簽:
Java
相關(guān)文章:
1. JavaMail 1.4 發(fā)布2. vue使用webSocket更新實(shí)時(shí)天氣的方法3. plsql實(shí)現(xiàn)DES對(duì)稱加密 Java解密4. Java Swing實(shí)現(xiàn)坦克大戰(zhàn)游戲5. javaScript實(shí)現(xiàn)網(wǎng)頁版的彈球游戲6. 2005年11月程序語言世界排行榜-Java居首位7. java中throws實(shí)例用法詳解8. JavaScript異步編程之Promise的初步使用詳解9. 詳解JavaScript中的鏈?zhǔn)秸{(diào)用10. EJB3.0部署消息驅(qū)動(dòng)Bean拋javax.naming.NameNotFoundException異常
排行榜
