日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀] Java[1]語言為字符串操作提供了豐富的支持,它將字符串封裝在三個類中并提供多種字符串操作接口。在Java應用程序中,由于對字符串的使用量比較高,從而使得其需要消耗較大的堆空間。例如在J2EE應用

Java[1]語言為字符串操作提供了豐富的支持,它將字符串封裝在三個類中并提供多種字符串操作接口。在Java應用程序中,由于對字符串的使用量比較高,從而使得其需要消耗較大的堆空間。例如在J2EE應用服務器運行過程中,約40%的活躍堆空間被用來保存字符串數(shù)據(jù)[2]。

通過對Java中字符串操作接口的分析可以發(fā)現(xiàn),隨著這些操作的運行會產(chǎn)生較多的無用字符串,它們不再被Java類封裝并且也不被任何變量引用。這些無用字符串數(shù)據(jù)將一直停留在活躍堆中,直到Java虛擬機啟動垃圾收集將其回收。而由于字符串數(shù)據(jù)具有單個對象占用空間較小但總體數(shù)量很大的特征,大量的無用字符串數(shù)據(jù)不僅會影響堆空間的利用率,并且對Java虛擬機垃圾收集的性能有較大影響。

當前對Java中字符串的內(nèi)存管理優(yōu)化方案主要關注于字符串的使用效率上,如消除常量重復、延遲分配等技術[2],通過修改Java虛擬機對字符串分配回收的支持來提高堆中字符串的使用效率。然而這些方案無法處理堆中已經(jīng)成為無用字符串的數(shù)據(jù),只能等待垃圾收集來處理。

近期編譯時的獨立對象回收策略[3]則專注于在編譯階段對應用程序做分析并插入回收指令以回收無用對象空間,但是該方案對Java庫函數(shù)只做保守分析從而無法回收這些無用字符串。為此,本文從對字符串操作接口的分析出發(fā),識別各類操作對字符串的改變情況以利用獨立對象回收策略中的指令插樁技術來主動回收無用字符串對象,以提高堆空間的利用率、減低垃圾回收的負擔、改善Java虛擬機的性能。

1 Java中字符串的支持與分析

1.1 Java中字符串的支持

Java語言將字符串的表示和操作都封裝在StringBuilder、StringBuffer和String三個類中。其中前兩個類指向的字符串是可變的,String類指向的字符串是不變的。這三個類的內(nèi)部結構基本上一致,以StringBuilder為例,StringBuilder在Java中的結構如圖1所示。

從圖1可以看出,字符串數(shù)據(jù)由StringBuilder對象指向的value域保存,在內(nèi)存空間上反映為兩個對象:StringBuilder對象通過value域指向字符串對象。由于該類提供常用的可變字符串操作接口且相對另一個類StringBuffer具有較高的執(zhí)行效率,對字符串數(shù)據(jù)的操作在Java虛擬機中一般會將其轉(zhuǎn)換為StringBuilder對象再做處理。下面以一個語句示例來說明這一點:

 String s=new String(‘aa’+’bb’+’cc’);
該語句的語義是將三個字符串連接在一起并生成一個String對象,在Java語言的源程序級別上不會出現(xiàn)StringBuilder對象,但是經(jīng)過編譯器優(yōu)化之后,這條語句實際被翻譯為下面的字節(jié)碼形式(為簡化描述,本文以源語言來表示字節(jié)碼的操作):
StringBuilder t=new StringBuilder(‘aa’);
t.append(‘bb’);
t.append(‘cc’);
String s=t.toString();

即Java編譯器會首先創(chuàng)建一個StringBuilder對象,完成字符串的連接工作之后再將其轉(zhuǎn)變?yōu)镾tring對象。由于類似于這種情況的字符串操作較多地出現(xiàn)在輸出方法和字符串創(chuàng)建方法中,所以可推斷出StringBuilder有著較大的使用頻率,故將以其為代表分析其提供的接口對字符串的影響。

1.2 無用字符串的產(chǎn)生

在上節(jié)的示例中,StringBuilder類提供的append()接口將會改變value域所指向的字符串,其做法是:新建長度為連接后字符串長度之和的字符數(shù)組,分段復制之后使其成為value域指向的新數(shù)組,而value域指向的原數(shù)組將被丟棄成為無用字符串。

圖2為示例語句中append()接口引起的value域指向字符串變化圖。

從圖2可以看出,在append()接口執(zhí)行過后,對象的字符數(shù)組將指向新建的字符串’aabb’,原有字符串’aa’將不被任何變量指向而成為無用字符串。

由于StringBuilder類的value域指向的字符串是可變的,在其提供的接口中存在大量類似append()可能對value域做出改變的接口,如insert()、replace()等。而在Java虛擬機對這些接口的調(diào)用頻率較多,表1是基準測試程序Jolden[4]的4個子程序中字符串操作接口調(diào)用次數(shù)以及可能對value域做出改變的接口調(diào)用次數(shù)對比。

由表1可以看出,可能對value域做出改變的調(diào)用次數(shù)占字符串操作接口調(diào)用次數(shù)的22.6%~45.7%,占有不可忽視的比例。下面將深入分析這些可能改變value域的操作接口的具體實現(xiàn)。

1.3 字符串操作接口分析

可能對value域做出改變的操作接口有一個共同點,即this對象不會發(fā)生變化,只是其value域指向一個新建的字符串。對字符串的操作接口做深入分析后可知,在append()等可能改變value域指向的操作接口的實現(xiàn)中,存在兩條改變分支:例如在接口append(s)中,如果s為null或者s的value域指向一個空字符串,則該接口不會改變this對象的value域指向;否則才會新建一個字符串以被this對象的value域指向。

可以將這兩條改變分支表現(xiàn)為下面的形式:
分支1:不做任何改變。
分支2:新建字符串,使其被this對象的value域指向,原有字符串成為無用字符串。
下面將給出根據(jù)本節(jié)的分析給出的無用字符串回收方案。

2 字符串的回收方案

對無用字符串的回收存在兩個難點:(1)不可深入改變Java的庫函數(shù)實現(xiàn)。因為回收方案需要具有較強的通用性和靈活性;(2)由于操作接口具體實現(xiàn)中對value域的改變存在分支,并且只能在應用程序的運行階段判斷究竟執(zhí)行的是哪個分支。

本文采用獨立對象顯式回收策略中的指令插樁技術來解決上述兩個難題:在可能發(fā)生改變的字符串操作接口調(diào)用點處插入判定語句來對操作接口執(zhí)行的分支做判斷,然后根據(jù)結果來實施字符串的回收方案。由于這些語句都插樁在用戶程序中,不會改變Java庫函數(shù)的實現(xiàn),而且這些語句會隨著字符串操作接口的執(zhí)行而執(zhí)行,所收集的信息屬于運行時信息,故可以很好地判斷運行時分支的情況。

由于兩條分支的不同之處表現(xiàn)為操作接口執(zhí)行完畢之后,this對象的value域指向是否發(fā)生了變化,故可以采取接口調(diào)用前后value域比較的方式來判斷具體執(zhí)行的分支。本文使用指令插樁技術,在Java虛擬機重編譯Java字節(jié)碼時對其做指令插樁工作,其處理流程為:

(1)在Java虛擬機處理應用程序指令時判斷其是否為可能引起字符串變化的操作接口調(diào)用指令。
(2)如果是則實施步驟(3)~(5)的指令插樁工作。
(3)在調(diào)用指令之前插入this對象的value域引用保存指令。
(4)在調(diào)用指令之后插入this對象的value域引用保存指令。
(5)安插兩個引用的對比指令,如果不同,則插入回收指令以回收調(diào)用之前保存的引用;否則將不做處理。

本方案用到了獨立對象回收技術中的回收指令,需要在Java虛擬機的內(nèi)存管理模塊支持這個回收指令。由于對回收指令的支持對原有的分配和回收方案影響很小,故其實現(xiàn)較簡單并且具有一定的通用性。

以圖3為例來說明本文的字符串回收方案。由于該方案處理的為Java字節(jié)碼,為了方便理解,將以實際代碼的形式體現(xiàn):由圖3可看出,在調(diào)用點前后加入了value域引用保存指令記錄了調(diào)用點執(zhí)行前后的value域的引用信息,然后將兩者做對比處理來判斷調(diào)用點是否對value域的引用做出了改變,如果引用信息有了變化,則之前的value域引用成為了無用字符串,可以插入回收指令將其回收。

可以將該無用字符串回收方案應用到其他可能對對象內(nèi)部value域指向的字符串做出改變的接口調(diào)用點,即可以在運行時回收由這些接口運行而出現(xiàn)的無用字符串數(shù)據(jù)。

3 實驗結果及分析

在Apache的開源Java SE(Standard Edition)平臺Harmony[5]上實現(xiàn)了針對字符串的回收方案,并做了相關的實驗測試。測試平臺的操作系統(tǒng)是Windows 7 Ultimate,CPU為Intel Pentium Dual E2200,主頻為2.2 GHz,內(nèi)存為2 GB。測試用例為Jolden中的4個基準程序。

在實現(xiàn)了無用字符串的顯式回收之后,可以在運行中主動回收一些無用字符串以提高活躍堆空間的利用率和降低Java虛擬機垃圾回收的開銷。表2給出了主動回收的無用字符串大小和總分配大小的比較情況。

由表2可以看出,本文的回收方案主動回收的無用字符串占應用程序總分配空間的5%~18%,對堆空間的利用率有較大的提升。對無用字符串的主動回收也帶來了Java虛擬機的性能提升,因為可以減輕垃圾收集的負擔。表3給出了實現(xiàn)無用字符串回收方案前后測試程序在Java虛擬機中的執(zhí)行時間對比。

 由表3可以看出,經(jīng)過對無用字符串的主動回收處理,Java虛擬機對應用程序的執(zhí)行效率也有了改善,分別減少了1%~5%。這說明無用字符串的回收可以提升Java虛擬機的性能。

本文提出一種對Java應用程序中無用字符串進行顯式回收的方案,以指令插樁的形式收集應用程序運行時信息并主動回收堆中無用字符串,以提高堆空間的利用率。實驗結果表明,該方案可以有效提高Java虛擬機的性能和Java應用程序的執(zhí)行效率。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉