999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Java程序的內存空間布局規則研究*

2017-01-05 01:40:31楊靜楊觀賜
單片機與嵌入式系統應用 2016年12期
關鍵詞:程序規則

楊靜,楊觀賜

(貴州大學 現代制造技術教育部重點實驗室,貴陽 550000)

?

基于Java程序的內存空間布局規則研究*

楊靜,楊觀賜

(貴州大學 現代制造技術教育部重點實驗室,貴陽 550000)

針對在一定大小的內存空間中Jave虛擬機在處理大型Jave程序時,Jave對象之間頻繁交互導致內存占用高、處理效率低的問題,給出了減少Jave對象占用內存空間的三種布局規則。該規則利用Jave虛擬機運行機制,綜合對象屬性及影響內存空間大小等指標,得出相同對象不同屬性之間按規則存放順序的最優方法。結果表明,相對傳統的相同對象不同屬性之間無規則的存放方法,按規則存放順序的方法能夠大幅度節省內存空間,并有效提高Jave虛擬機的運行效率,程序對象越多,該方法對內存空間的節省和計算效率的提高效果就越明顯。

Jave程序;內存空間;布局規則;屬性;對象

引 言

隨著社會經濟的迅猛發展與市場對軟件性能要求的提高,基于Java的應用程序因其具有“一次編譯,到處運行”的特點而得到廣泛應用。雖然Java開發人員對JDK虛擬機解釋器不斷進行優化處理,但是仍然不能完全令用戶滿意。目前國內Java研究者主要將焦點放在提高現有的開發設備,但是面對大型的Java程序時,效果并不明顯[1]。參考文獻[2]中提出在Java虛擬機中使用垃圾回收機制。在虛擬監控之下,垃圾收集器將定期進行清除行動,當所有對象是非常穩定的,此時垃圾回收器的效率會非常低,切換到“標記-掃描”模式,當堆空間存在很多碎片,切換到“標記-清理”模式,但如果想撤銷內存之外的清理工作,就只能調用Java的某個方法,這樣做只是對虛擬機中產生的垃圾進行清理,從而減少內存占用。參考文獻[3]介紹了Java的多線程機制的應用,從而減少內存消耗,提高程序運行速度,但是Java的多線程機制容易造成死鎖和資源分配不均等問題。參考文獻[4]采用三種基于硬件的代碼緩存策略,采用動態方式寫入和讀取Java代碼,這種方式過于依賴CPU執行性能。參考文獻[5]主要研究了內存池空間調度數據的研究,通過內存池解決了內外存之間頻繁的交付問題。參考文獻[6]、[7]介紹了一種Java虛擬機將類的全限定名分離為不同的結點,減少整個類的字符串在常量池中所占據的大小,這使得在內存有限的系統中裝載.class文件后,能減少對存儲空間的占用。

本文主要從Java對象占用空間的角度分析,對Java對象空間做優化處理,首先分析了Java虛擬機以及Java類的加載過程,其次研究了Java對象的性質,提出了Java對象的使用規則,從而達到降低內存消耗,提高運行效率的目的。

1 Java內存空間的工作原理

Java虛擬機(Java virtual machine,JVM)是運行 Java 程序必不可少的機制。JVM實現了Java語言最重要的特征,即平臺無關性。其原理為編譯后的 Java 程序指令并不直接在硬件系統的 CPU 上執行,而是由 JVM 執行。JVM屏蔽了與具體平臺相關的信息,使Java語言編譯程序只需要生成在JVM上運行的目標字節碼(.class),就可以在多種平臺上不加修改地運行。Java 虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行,因此實現Java平臺的無關性。它是 Java 程序能在多平臺間進行無縫移植的可靠保證,同時也是 Java 程序的安全檢驗引擎(還進行安全檢查)。JVM 是 編譯后的Java 程序(.class文件)和硬件系統之間的接口(編譯后,Javac 是收錄于JDK中的Java 語言編譯器,該工具可以將后綴名為.Java的源文件編譯為后綴名為.class的可以運行于Java虛擬機的字節碼)。Java內存空間工作原理如圖1所示。

圖1 Java內存空間工作原理

JVM=類加載器classloader+執行引擎execution engine+運行時數據區域runtime data area classloader,把硬盤上的.class文件加載到JVM中運行時數據區域,但是它不負責這個類文件能否執行,這個是執行引擎負責的[8]。classloader作用是裝載.class文件,classloader有兩種裝載.class的方式:第一種:隱式,運行過程中,碰到new方式生成對象,隱式調用classloader到JVM;第二種:顯示,通過class.forname()動態加載[9]。

類的加載過程采用雙親委托機制[10],這種機制能更好地保證Java平臺的安全。該模型要求除了頂層的Bootstrap Class Loader啟動類加載器外,其余的類加載器都應當有自己的父類加載器。子類加載器和父類加載器不是以繼承(interface)關系來復用父類加載器的代碼。每個類加載器都有自己的命名空間(由該加載器及所有父類加載器所加載的類組成,在同一個命名空間中,不會出現類的完整名字(包括類的包名)相同的兩個類;在不同的命名空間中,有可能會出現類的完整名字(包括類的包名)相同的兩個類)。雙親委托機制具體的工作過程為:classloader首先從自己已經加載的類中查詢是否此類已經加載,如果已經加載,則直接返回原來已經加載的類。每個類加載器都有自己的加載緩存,當一個類被加載了以后就會放入緩存,等下次加載的時候就可以直接返回。如果沒有找到被加載的類,則委托父類加載器去加載,父類加載器采用同樣的策略,首先查看自己的緩存,然后委托父類的父類去加載,一直到Bookstrap Class Loader。當所有父類加載器都沒有加載的時候,再由當前的類加載器加載,并將其放入它自己的緩存中,以便下次有加載請求的時候直接返回。使用這種模型來組織類加載器之間的關系,主要是為了安全性,避免用戶自己編寫的類動態替換Java的一些核心類(比如String),同時也避免了重復加載,因為JVM中區分不同類,不僅僅是根據類名,相同的.class文件被不同的classloader加載就是不同的兩個類,如果相互轉型的話,會拋Java.lang.ClassCaseException。類加載器[11]classloader是具有層次架構的,也就是父子關系。其中,Boolstrap是所有類加載器的父親。具體關系如圖2所示。

圖2 Java類的加載過程

2 對象所占空間分配規則及內存使用情況

2.1 對象所占空間分析

Java對象內存布局:對象頭(header)、實例數據(Instance Data)和對齊填充(padding)[12]。所在環境為32位的windows系統,對象頭在32位系統中占用8字節。原生類型[13](Primitive Type)的內存占用如表1所列。

表1 原生類型的內存占用

Reference在32位系統上每個占用4字節。對齊填充,Hotspot的對齊方式為8字節對齊:(對象頭+實例數據+padding)%8=0,且0≤padding<8。首先,任何對象都是8字節對齊,對象占用內存大小的計算公式為:

對象占用字節數=基本的8字節+基本數據類型所占用的內存空間(累加后對齊到8的倍數)+對象引用所占用的空間(累加后對齊到8的倍數)

2.2 對象所占空間的分配規則

經過前面對Java對象相關屬性分析以及Java虛擬機的工作原理和Java類的加載過程的分析研究,可以知道Sun公司的Jave虛擬機并沒有按照屬性聲明的順序來進行內存布局,而是按照下面的順序規則來進行內存布局:[long,double]、[int,float]、[char,short]、[byte,boolean]、reference(引用類型),這樣可以節約Java運行時的內存空間。舉例如下:

Public class Test{

Byte a;

Boolean b;

Char c;

Short d;

Float e;

Double f;

Object g;

}

如果這個對象的屬性按照無規則的順序存放的話,要占用的空間為:head(8)+a(1)+b(1)+c(2)+d(2)+padding(2)+e(4)+padding(4)+f(8)+g(4)+padding(4)=40,但是按照這個規則得到:head(8)+f(8)+e(4)+d(2)+c(2)+a(1)+b(1)+e(4)+padding(2)=32,可以看到節省了不少空間。

2.3 Java繼承其他子類的內存布局規則

Java虛擬機將遵循以下規則來組織父類中的類成員以及子類和父類中類成員的關系,規則如下:不同類繼承關系中的成員不能混合排列。首先按照規則1處理父類中的成員,接著才是子類的成員。舉例:

Class A{

Long a;

Int b;

Int c;

}

Class B extends A{

Long d;

}

這樣存放的順序及占用空間如下:head(8)+a(8)+b(4)+c(4)+d(8)=32。這是比較理想的情況,父類成員和子類成員剛好滿足對其的填充規則,但在實際編程中,如果父類中的屬性不夠8個字節,就有了新的一條內存布局規則:父類中最后一個成員與子類的第一個成員的間隔如果不夠4個字節,此時需要擴展到4個字節的基本單位,舉例:

Class A{

Byte a;

}

Class B extends A{

Byte b;

}

那么此時占用的空間如下:head(8)+a(1)+padding(3)+b(1)+padding(3)=16,顯然這種方式比較浪費空間。

當子類的第一個成員是Double或者Long,并且父類并沒有用完8個字節,此時JVM會破壞規則,將較小的數據填充到該空間,舉例:

Class A{

Byte a;

}

Class B extends A{

Long b;

Short c;

Byte d;

}

此時占用的空間如下:head(8)+a(1)+padding(3)+c(2)+d(1)+padding(1)+b(8)=24。

2.4 內存使用情況

針對Java程序進行內存空間優化處理之前,必須對被優化的目標進行有效分析。開發人員只有通過內存測試過程發現程序中哪部分代碼需要進行優化,才能夠針對實際情況選擇相應的優化策略。有多種方式可以用于發現Java程序中的內存泄漏現象。最簡單的方法就是使用一個操作系統進程監視器,它可以提供一個正在運行的進程所使用的內存數t,也可以使用JavaRuntime類中提供的totalMemory()和freeMemory()等方法來得到虛擬機所控制的連續內存空間的內存容量t,以及在特定時刻未使用的內存容量t,通過將兩個方法捆綁在一起使用,可以計算出當前運行的Java程序所使用的內存量。大多數商業用的Java集成開發環境并沒有提供虛擬機級的控制,因此通常可以通過JDK來完成對內存使用狀況的測試。

結 語

在Java虛擬機中優化Java程序設計,就是充分利用軟硬件資源,根據Java對象分配規則,采取相應的

Layout Rules of Memory Space Based on Java Program

Yang Jing,Yang Guanci

(Key Laboratory of Ministry of Education for Advanced Manufacturing Technology,Guizhou University,Guiyang 550000,China)

Frequent interaction between Java objects will cause high memory occupancy and low processing efficiency when the Java virtual machine in the treatment of the large Java program in memory space of a certain size.A new method to reduce the memory space occupancy is given.The method uses the object allocation rules,comprehensive the object properties and influence of memory size and other indicators,obtains the optimal method between the different attributes of the same object by the rules of order.The experiment results show that the method can greatly save memory space and effectively improve the operating efficiency of the Java virtual machine.The more program objects,the effect is more obvious.

Java program;memory space;layout rules;property;object

貴州省優秀青年科技人才培養對象專項資金項目(黔科合人字(2015)13號)。

TP311.1

A

猜你喜歡
程序規則
撐竿跳規則的制定
數獨的規則和演變
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
規則的正確打開方式
幸福(2018年33期)2018-12-05 05:22:42
失能的信仰——走向衰亡的民事訴訟程序
讓規則不規則
Coco薇(2017年11期)2018-01-03 20:59:57
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
TPP反腐敗規則對我國的啟示
搜索新規則
主站蜘蛛池模板: 99偷拍视频精品一区二区| 国产在线视频自拍| 538国产视频| 亚洲最黄视频| 国产精品视频观看裸模| 玖玖免费视频在线观看| 欧美日韩导航| jizz在线观看| 五月天福利视频| 在线不卡免费视频| 国产国产人成免费视频77777| 91国内在线观看| 97亚洲色综久久精品| 日韩av资源在线| 欧美另类图片视频无弹跳第一页| 欧洲高清无码在线| 成人无码一区二区三区视频在线观看| AV在线麻免费观看网站| 亚洲美女高潮久久久久久久| 国产SUV精品一区二区| 人妻丰满熟妇AV无码区| 亚洲欧美成aⅴ人在线观看 | 天堂网亚洲系列亚洲系列| 日韩天堂视频| 99在线观看国产| 国产综合色在线视频播放线视| 国产网站黄| 国产伦片中文免费观看| 国产无码高清视频不卡| 亚洲一区网站| 波多野结衣一区二区三区88| 一级毛片免费观看久| 97狠狠操| 午夜免费视频网站| 欧美精品xx| 久久99热这里只有精品免费看| 人妻无码中文字幕一区二区三区| 国产无码精品在线播放| 99re热精品视频国产免费| 欧美精品H在线播放| 免费无遮挡AV| 久久婷婷色综合老司机| 99在线观看免费视频| 色噜噜在线观看| 亚洲日韩欧美在线观看| 伊人色婷婷| 久久国产精品嫖妓| 国产欧美日韩另类| 亚洲中文字幕在线观看| 强乱中文字幕在线播放不卡| 亚洲第七页| 成人a免费α片在线视频网站| 精品丝袜美腿国产一区| 免费Aⅴ片在线观看蜜芽Tⅴ| 国产丝袜第一页| 日韩在线永久免费播放| 国产精品久久自在自2021| 麻豆国产在线观看一区二区| 亚洲视频免费在线看| 九九久久99精品| 成年人免费国产视频| 欧美一级黄片一区2区| 亚洲天堂高清| a级毛片免费播放| 久久免费精品琪琪| 凹凸国产熟女精品视频| 日本一本正道综合久久dvd | 爆乳熟妇一区二区三区| 亚洲国产综合精品一区| 国产黄在线免费观看| 国产视频一区二区在线观看 | 男女精品视频| 在线免费观看a视频| 精品一区二区三区中文字幕| 2021国产精品自产拍在线观看| 日韩精品欧美国产在线| 91麻豆精品国产高清在线| 欧美色伊人| 一本综合久久| 狠狠躁天天躁夜夜躁婷婷| 久久天天躁夜夜躁狠狠| 中文字幕在线一区二区在线|