freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

java虛擬機詳解-文庫吧資料

2025-07-04 08:27本頁面
  

【正文】 下的內(nèi)存就供每一個線程的VM棧和本地方法棧瓜分了,那自然每個線程中VM棧分配內(nèi)存越多,就越容易把剩下的內(nèi)存耗盡。如果在多線程環(huán)境下,不斷建立線程倒是可以產(chǎn)生OOM異常,但是基本上這個異常和VM??臻g夠不夠關(guān)系沒有直接關(guān)系,甚至是給每個線程的VM棧分配的內(nèi)存越多反而越容易產(chǎn)生這個OOM異常。}}throw e。(stack length: + )。()。JavaVMStackSOF oom = new JavaVMStackSOF()。public static void main(String[] args) throws Throwable {}stackLeak()。private int stackLength = 1。*/public class JavaVMStackSOF {* VM Args:Xss128k,打開逃逸分析和標量替換選項,使得JIT編譯器允許對象拆分后在棧中分配。,增大此方法對應(yīng)幀的長度。關(guān)于VM棧和本地方法棧在VM Spec描述了兩種異常:StackOverflowError與OutOfMemoryError,當??臻g無法繼續(xù)分配分配時,到底是內(nèi)存太小還是棧太大其實某種意義上是對同一件事情的兩種描述而已,在筆者的實驗中,對于單線程應(yīng)用嘗試下面3種方法均無法讓虛擬機產(chǎn)生OOM,全部嘗試結(jié)果都是獲得SOF異常。VM棧和本地方法棧運行結(jié)果:: Java heap spaceDumping heap to ...Heap dump file created [22045981 bytes in secs]}while (true) {ListOOMObject list = new ArrayListOOMObject()。public static void main(String[] args) {}* author zzm)清單1:Java堆OOM測試/**測試中限制Java堆大小為20M,不可擴展,通過參數(shù)XX:+HeapDumpOnOutOfMemoryError讓虛擬機在出現(xiàn)OOM異常的時候Dump出內(nèi)存映像以便分析。Java堆下文的代碼都是基于Sun ,對于不同公司的不同版本的虛擬機,參數(shù)與程序運行結(jié)果可能結(jié)果會有所差別。這樣能在一些場景中顯著提高性能,因為避免了在Java對和本機堆中來回復(fù)制數(shù)據(jù)。但是這部分內(nèi)存也會導(dǎo)致OutOfMemoryError異常出現(xiàn),因此我們放到這里一起描述。但是Java語言并不要求常量一定只有編譯期預(yù)置入Class的常量表的內(nèi)容才能進入方法區(qū)常量池,運行期間也可將新內(nèi)容放入常量池(()方法)。相對來說,垃圾收集行為在這個區(qū)域是相對比較少發(fā)生的,但并不是某些描述那樣永久代不會發(fā)生GC(至少對當前主流的商業(yè)JVM實現(xiàn)來說是如此),這里的GC主要是對常量池的回收和對類的卸載,雖然回收的“成績”一般也比較差強人意,尤其是類卸載,條件相當苛刻。方法區(qū)中存放了每個Class的結(jié)構(gòu)信息,包括常量池、字段描述、方法描述等等。(Method Area)叫“方法區(qū)”可能認識它的人還不太多,如果叫永久代(Permanent Generation)它的粉絲也許就多了。實現(xiàn)時可以選擇實現(xiàn)成固定大小的,也可以是可擴展的,不過當前所有商業(yè)的虛擬機都是按照可擴展來實現(xiàn)的(通過Xmx和Xms控制)。Java堆內(nèi)還有更細致的劃分:新生代、老年代,再細致一點的:eden、from survivor、to survivor,甚至更細粒度的本地線程分配緩沖(TLAB)等,無論對Java堆如何劃分,目的都是為了更好的回收內(nèi)存,或者更快的分配內(nèi)存,在本章中我們僅僅針對內(nèi)存區(qū)域的作用進行討論,Java堆中的上述各個區(qū)域的細節(jié),可參見本文第二章《JVM內(nèi)存管理:深入垃圾收集器與內(nèi)存分配策略》。Java堆的唯一目的就是存放對象實例,絕大部分的對象實例都在這里分配。(Java Heap)對于絕大多數(shù)應(yīng)用來說,Java堆是虛擬機管理最大的一塊內(nèi)存。它的實現(xiàn)的語言、方式與結(jié)構(gòu)并沒有強制規(guī)定,甚至有的虛擬機(譬如Sun Hotspot虛擬機)直接就把本地方法棧和VM棧合二為一。在VM Spec中對這個區(qū)域規(guī)定了2中異常狀況:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常;如果VM棧可以動態(tài)擴展(VM Spec中允許固定長度的VM棧),當擴展時無法申請到足夠內(nèi)存則拋出OutOfMemoryError異常。其中l(wèi)ong和double會占用2個本地變量空間(32bit),其余占用1個。其中所指的“堆”后面會專門描述,而所指的“?!本褪荲M棧中各個幀的本地變量表部分。在后文中,我們將著重討論VM棧中本地變量表部分。VM棧描述的是Java方法調(diào)用的內(nèi)存模型:每個方法被執(zhí)行的時候,都會同時創(chuàng)建一個幀(Frame)用于存儲本地變量表、操作棧、動態(tài)鏈接、方法出入口等信息。每一個Java線程都有一個程序計數(shù)器來用于保存程序執(zhí)行到當前方法的哪一個指令,對于非Native方法,這個區(qū)域記錄的是正在執(zhí)行的VM原語的地址,如果正在執(zhí)行的是Natvie方法,這個區(qū)域則為空(undefined)。根據(jù)《Java虛擬機規(guī)范(第二版)》(下文稱VM Spec)的規(guī)定,JVM包括下列幾個運行時數(shù)據(jù)區(qū)域:對于Java程序員來說,不需要在為每一個new操作去寫配對的delete/free,不容易出現(xiàn)內(nèi)容泄漏和內(nèi)存溢出錯誤,看起來由JVM管理內(nèi)存一切都很美好。概述:對于從事C、C++程序開發(fā)的開發(fā)人員來說,在內(nèi)存管理領(lǐng)域,他們即是擁有最高權(quán)力的皇帝又是執(zhí)行最基礎(chǔ)工作的勞動人民——擁有每一個對象的“所有權(quán)”,又擔負著每一個對象生命開始到終結(jié)的維護責任。JVM內(nèi)存管理:深入Java內(nèi)存區(qū)域與OOMJava與C++之間有一堵由內(nèi)存動態(tài)分配和垃圾收集技術(shù)所圍成的高墻,墻外面的人想進去,墻里面的人卻想出來。The World Collection),你的應(yīng)用能承受這個嗎?問:()?答:因為顯式聲明是做堆內(nèi)存全掃描,也就是Full GC,是需要停止所有的活動的(Stop安全管理器(Security Manager):提供Java運行期的安全控制,防止惡意攻擊,比如指定讀取文件,寫入文件權(quán)限,網(wǎng)絡(luò)訪問,創(chuàng)建進程等等,Class Loader在Security Manager認證通過后才能加載class文件的。問:JVM還有哪些部分是你沒有提到的?答:JVM是一個異常復(fù)雜的東西,寫一本磚頭書都不為過,還有幾個要說明的:常量池(constant pool):按照順序存放程序中的常量,并且進行索引編號的區(qū)域。Sun為了解決該問題提出了一套新的機制,好,你想編譯成原生代碼,沒問題,我在JVM上提供一個工具,把字節(jié)碼編譯成原生碼,下次你來訪問的時候直接訪問原生碼就成了,于是JIT就誕生了,就這么回事。問:什么是JIT,你怎么沒說?答:JIT是指Just In Time,有的文檔把JIT作為JVM的一個部件來介紹,有的是作為執(zhí)行引擎的一部分來介紹,這都能理解。JVM之間是不可以互訪,你不能在AJVM中訪問BJVM的Heap內(nèi)存,這是不可能的。問:OutOfMemory錯誤分幾種?答:分兩種,分別是“OutOfMemoryError:java heap size”和”O(jiān)utOfMemoryError: PermGen space”,兩種都是內(nèi)存溢出,heap size是說申請不到新的內(nèi)存了,這個很常見,檢查應(yīng)用或調(diào)整堆內(nèi)存大小。產(chǎn)生的對象是先產(chǎn)生問:為什么會產(chǎn)生OutOfMemory產(chǎn)生?答:一句話:Heap內(nèi)存中沒有足夠的可用內(nèi)存了。對于原始數(shù)據(jù)類型,JVM的處理方法是從Method Area或Heap中拷貝到Stack,然后運行frame中的方法,運行完畢后再把變量指拷貝回去。問:類變量和實例變量有什么區(qū)別?答:靜態(tài)變量是類變量,非靜態(tài)變量是實例變量,直白的說,有static修飾的變量是靜態(tài)變量,沒有static修飾的變量是實例變量。問:堆內(nèi)存中到底存在著什么東西?答:對象,包括對象變量以及對象方法。棧是跟隨線程的,有線程就有棧,堆是跟隨JVM的,有JVM就有堆內(nèi)存。本地方法棧程序計數(shù)器每個線程都有一個程序計數(shù)器,就是一個指針,指向方法區(qū)中的方法字節(jié)碼,由執(zhí)行引擎讀取下一條指令。方法區(qū)方法區(qū)是被所有線程共享,該區(qū)域保存所有字段和方法字節(jié)碼,以及一些特殊方法如構(gòu)造函數(shù),接口代碼也在此定義。三個區(qū)的示意圖如下:Tenure generation space養(yǎng)老區(qū)養(yǎng)老區(qū)用于保存從新生區(qū)篩選出來的JAVA對象,一般池對象都在這個區(qū)域活躍。若幸存0區(qū)也滿了,再對該區(qū)進行垃圾回收,然后移動到1區(qū)。當伊甸園的空間用完時,程序又需要創(chuàng)建對象,JVM的垃圾回收器將對伊甸園區(qū)進行垃圾回收,將伊甸園區(qū)中的不再被其他對象所引用的對象進行銷毀。幸存區(qū)有兩個:新生區(qū)新生區(qū)是類的誕生、成長、消亡的區(qū)域,一個類在這里產(chǎn)生,應(yīng)用,最后被垃圾回收器收集,結(jié)束生命。永久存儲區(qū)永久存儲區(qū)是一個常駐內(nèi)存區(qū)域,用于存放JDK自身所攜帶的Class,Interface的元數(shù)據(jù),也就是說它存儲的是運行環(huán)境必須的類信息,被裝載進此區(qū)域的數(shù)據(jù)是不會被垃圾回收器回收掉的,關(guān)閉JVM才會釋放此區(qū)域所占用的內(nèi)存。堆內(nèi)存一個JVM實例只存在一個堆類存,堆內(nèi)存的大小是可以調(diào)節(jié)的。圖示在一個棧中有兩個棧幀,棧幀2是最先被調(diào)用的方法,先入棧,然后方法2又調(diào)用了方法1,棧幀1處于棧頂?shù)奈恢?,棧?處于棧底,執(zhí)行完畢后,依次彈出棧幀1和棧幀2,線程結(jié)束,棧釋放。那棧幀中到底存在著什么數(shù)據(jù)呢?棧幀中主要保存3類數(shù)據(jù):本地變量(Local Variables),包括輸入?yún)?shù)和輸出參數(shù)以及方法內(nèi)的變量;棧操作(Operand Stack),記錄出棧、入棧的操作;棧幀數(shù)據(jù)(Frame Data),包括類文件、方法等等。棧棧也叫棧內(nèi)存,是Java程序的運行區(qū),是在線程創(chuàng)建時創(chuàng)建,它的生命期是跟隨線程的生命期,線程結(jié)束棧內(nèi)存也就釋放,對于棧來說不存在垃圾回收問題,只要線程一結(jié)束,該棧就Over。Runtime data area運行數(shù)據(jù)區(qū)運行數(shù)據(jù)區(qū)是整個JVM的重點。qNative Interface本地接口本地接口的作用是融合不同的編程語言為Java所用,它的初衷是融合C/C++程序,Java誕生的時候是C/C++橫行的時候,要想立足,必須有一個聰明的、睿智的調(diào)用C/C++程序,于是就在內(nèi)存中專門開辟了一塊區(qū)域處理標記為native的代碼,它的具體做法是Native Method Stack中登記native方法,在Execution Engine執(zhí)行時加載native libraies。qExecution Engineq}需要詳細了解的話,可以仔細閱讀《JVM Specification》的第四章“The class File Format”,這里不再詳細說明。u2 attributes_count。u2 methods_count。u2 fields_count。u2 interfaces_count。u2 this_class。cp_info constant_pool[constant_pool_count1]。u2 major_version。u4 magic。ClassFile {類加載器類加載器的作用是加載類文件到內(nèi)存,然后通過javac編譯成class文件,那怎么才能加載到內(nèi)存中被執(zhí)行呢?Class Loader承擔的就是這個責任,Class Loader加載的class文件是有格式要求,在《JVM Specification》中式這樣定義Class文件的結(jié)構(gòu):我們再來看下JVM有哪些組成部分,如下圖所示:JVM是一個內(nèi)存中的虛擬機,那它的存儲就是內(nèi)存了,我們寫的所有類、常量、變量、方法都在內(nèi)存中,這決定著我們程序運行的是否健壯、是否高效,接下來的部分就是重點介紹之。我們知道計算機的基本構(gòu)成是:運算器、控制器、存儲器、輸入和輸出設(shè)備,那這個JVM也是有這成套的元素,運算器是當然是交給硬件CPU還處理了,只是為了適應(yīng)“一次編譯,隨處運行”的情況,需要做一個翻譯動作,于是就用了JVM自己的命令集,這與匯編的命令集有點類似,每一種匯編命令集針對一個系列的CPU,比如8086系列的匯編也是可以用在8088上的,但是就不能跑在8051上,而JVM的命令集則是可以到處運行的,因為JVM做了翻譯,根據(jù)不同的CPU,翻譯成不同的機器語言。JVM全稱是Java Virtual Machine,Java虛擬機,也就是在計算機上再虛擬一個計算機,這和我
點擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1