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

正文內(nèi)容

java虛擬機(jī)詳解(存儲版)

2025-07-28 08:27上一頁面

下一頁面
  

【正文】 C(至少對當(dāng)前主流的商業(yè)JVM實(shí)現(xiàn)來說是如此),這里的GC主要是對常量池的回收和對類的卸載,雖然回收的“成績”一般也比較差強(qiáng)人意,尤其是類卸載,條件相當(dāng)苛刻。這樣能在一些場景中顯著提高性能,因?yàn)楸苊饬嗽贘ava對和本機(jī)堆中來回復(fù)制數(shù)據(jù)。測試中限制Java堆大小為20M,不可擴(kuò)展,通過參數(shù)XX:+HeapDumpOnOutOfMemoryError讓虛擬機(jī)在出現(xiàn)OOM異常的時(shí)候Dump出內(nèi)存映像以便分析。VM棧和本地方法棧,打開逃逸分析和標(biāo)量替換選項(xiàng),使得JIT編譯器允許對象拆分后在棧中分配。throw e。如果在多線程環(huán)境下,不斷建立線程倒是可以產(chǎn)生OOM異常,但是基本上這個(gè)異常和VM??臻g夠不夠關(guān)系沒有直接關(guān)系,甚至是給每個(gè)線程的VM棧分配的內(nèi)存越多反而越容易產(chǎn)生這個(gè)OOM異常。*/public class JavaVMStackOOM {private void dontStop() {}要在常量池里添加內(nèi)容,()這個(gè)Native方法。int i = 0。XX:PermSize=10M XX:MaxPermSize=10Mwhile (true) {})。*/public class DirectMemoryOOM {private static final int _1MB = 1024 * 1024。}運(yùn)行結(jié)果:Exception in thread main 總結(jié)到此為止,我們弄清楚虛擬機(jī)里面的內(nèi)存是如何劃分的,哪部分區(qū)域,什么樣的代碼、操作可能導(dǎo)致OOM異常。我認(rèn)為要認(rèn)識java線程安全,必須了解兩個(gè)主要的點(diǎn):java的內(nèi)存模型,java的線程同步機(jī)制。多個(gè)線程之間是不能互相傳遞數(shù)據(jù)通信的,它們之間的溝通只能通過共享變量來進(jìn)行。那么,什么是有序性呢a++。那么顯然,最終的x的值是不可靠的。int=}publicnum)16. withdraw(intnum。static22. Accountawithdraw)。31. AddThread{account。=41. publicimplements50. int51. amount。voidfor100000。60. 62. 3. }add(int3. }balance剛才不是說了synchronized的用法是這樣的嗎:Java代碼那么對于public synchronized void add(int num)這種情況,意味著什么呢?其實(shí)這種情況,鎖就是這個(gè)方法所在的對象。2. 4. 5. //do}如何讓線程主動釋放鎖很簡單,調(diào)用鎖的wait()方法就好。2. balance6. }eggs=new11. 15. 16. }voidIf(()0){try{notify()。整個(gè)過程都保證了放雞蛋,拿雞蛋,放雞蛋,拿雞蛋。 volatile是java提供的一種同步手段,只不過它是輕量級的同步,為什么這么說,因?yàn)関olatile只能保證多線程的內(nèi)存可見性,不能保證多線程的執(zhí)行有序性。4. 當(dāng)一個(gè)VolatileTest對象被多個(gè)線程共享,a的值不一定是正確的,因?yàn)閍=a+count包含了好幾步操作,而此時(shí)多個(gè)線程的執(zhí)行是無序的,因?yàn)闆]有任何機(jī)制來保證多個(gè)線程的執(zhí)行有序性和原子性。VolatileTest{概述:而Java堆和方法區(qū)(包括運(yùn)行時(shí)常量池)則不一樣,我們必須等到程序?qū)嶋H運(yùn)行期間才能知道會創(chuàng)建哪些對象,這部分內(nèi)存的分配和回收都是動態(tài)的,我們本文后續(xù)討論中的“內(nèi)存”分配與回收僅僅指這一部分內(nèi)存?! “褧r(shí)間從1960年撥回現(xiàn)在,回到我們熟悉的Java語言。JVM內(nèi)存管理:深入垃圾收集器與內(nèi)存分配策略Java與C++之間有一堵由內(nèi)存動態(tài)分配和垃圾收集技術(shù)所圍成的高墻,墻外面的人想進(jìn)去,墻里面的人卻想出來。6. }setA(intint1. public6. }count){a。class4 假設(shè)接著來了線程A,就重復(fù)2;假設(shè)來料線程B,就重復(fù)3。22. synchronized//喚醒阻塞隊(duì)列的某線程到就緒隊(duì)列()。Object}public1. package5. balance//聲明了一個(gè)對象作為鎖 假設(shè)有這樣一種情況,有一個(gè)桌子,桌子上面有一個(gè)盤子,盤子里只能放一顆雞蛋,A專門往盤子里放雞蛋,如果盤子里有雞蛋,則一直等到盤子里沒雞蛋,B專門從盤子里拿雞蛋,如果盤子里沒雞蛋,則等待直到盤子里有雞蛋。 生產(chǎn)者/消費(fèi)者模式其實(shí)是一種很經(jīng)典的線程同步模型,很多時(shí)候,并不是光保證多個(gè)線程對某共享資源操作的互斥性就夠了,往往多個(gè)線程之間都是有協(xié)作的。生產(chǎn)者/消費(fèi)者模式8. }(lock){3. ThreadTest{balancenum)synchronized臨界區(qū)代碼典型的用法如下:Java代碼63. }}61. i=amount)class(amount)。43. 40. intamount。account。static}()。26. WithdrawThread(account,add)。{balancepublic}+voidbalance。5. Account從上面的描述中可以知道x=x+1并不是一個(gè)原子操作,它的執(zhí)行過程如下:1 從主存中讀取變量x副本到工作內(nèi)存2 給x加13 將x加1后的值寫回主(3) 用工作內(nèi)存數(shù)據(jù)刷新主存相關(guān)內(nèi)容 (store and write)JVM規(guī)范定義了線程對主存的操作指令:read,load,use,assign,store,write。我們都知道計(jì)算機(jī)有高速緩存的存在,處理器并不是每次處理數(shù)據(jù)都是取內(nèi)存的。本人jameswxx原創(chuàng)文章,轉(zhuǎn)載請注明出處,我費(fèi)了很多心血,多謝了。at (:20)(true)。* VM Args:Xmx20M XX:MaxDirectMemorySize=10M()。return (obj, args)。清單5:借助CGLib使得方法區(qū)出現(xiàn)OOM異常/**public static void main(String[] args) {*/public class RuntimeConstantPoolOOM {}public void run() {Thread thread = new Thread(new Runnable() {while (true) {(這時(shí)候不妨設(shè)大些)}}()。private int stackLength = 1。*/public class JavaVMStackSOF {,增大此方法對應(yīng)幀的長度。運(yùn)行結(jié)果:: Java heap spaceDumping heap to ...Heap dump file created [22045981 bytes in secs]}Java堆但是這部分內(nèi)存也會導(dǎo)致OutOfMemoryError異常出現(xiàn),因此我們放到這里一起描述。方法區(qū)中存放了每個(gè)Class的結(jié)構(gòu)信息,包括常量池、字段描述、方法描述等等。Java堆的唯一目的就是存放對象實(shí)例,絕大部分的對象實(shí)例都在這里分配。其中l(wèi)ong和double會占用2個(gè)本地變量空間(32bit),其余占用1個(gè)。對于Java程序員來說,不需要在為每一個(gè)new操作去寫配對的delete/free,不容易出現(xiàn)內(nèi)容泄漏和內(nèi)存溢出錯(cuò)誤,看起來由JVM管理內(nèi)存一切都很美好。問:()?答:因?yàn)轱@式聲明是做堆內(nèi)存全掃描,也就是Full GC,是需要停止所有的活動的(Stop安全管理器(Security Manager):提供Java運(yùn)行期的安全控制,防止惡意攻擊,比如指定讀取文件,寫入文件權(quán)限,網(wǎng)絡(luò)訪問,創(chuàng)建進(jìn)程等等,Class Loader在Security Manager認(rèn)證通過后才能加載class文件的。幸存區(qū)有兩個(gè):Native Interface本地接口本地接口的作用是融合不同的編程語言為Java所用,它的初衷是融合C/C++程序,Java誕生的時(shí)候是C/C++橫行的時(shí)候,要想立足,必須有一個(gè)聰明的、睿智的調(diào)用C/C++程序,于是就在內(nèi)存中專門開辟了一塊區(qū)域處理標(biāo)記為native的代碼,它的具體做法是Native Method Stack中登記native方法,在Execution Engine執(zhí)行時(shí)加載native libraies。}需要詳細(xì)了解的話,可以仔細(xì)閱讀《JVM Specification》的第四章“The class File Format”,這里不再詳細(xì)說明。u2 fields_count。u2 major_version。類加載器類加載器的作用是加載類文件到內(nèi)存,然后通過javac編譯成class文件,那怎么才能加載到內(nèi)存中被執(zhí)行呢?Class Loader承擔(dān)的就是這個(gè)責(zé)任,Class Loader加載的class文件是有格式要求,在《JVM Specification》中式這樣定義Class文件的結(jié)構(gòu):JVM是一個(gè)內(nèi)存中的虛擬機(jī),那它的存儲就是內(nèi)存了,我們寫的所有類、常量、變量、方法都在內(nèi)存中,這決定著我們程序運(yùn)行的是否健壯、是否高效,接下來的部分就是重點(diǎn)介紹之。 結(jié)束語本文通過對JVM的體系結(jié)構(gòu)的深入研究以及一個(gè)Java程序執(zhí)行時(shí)虛擬機(jī)的運(yùn)行過程的詳細(xì)分析,意在剖析清楚Java虛擬機(jī)的機(jī)理。如果這個(gè)進(jìn)程失敗,則拋出一個(gè)異常。虛擬機(jī)通過調(diào)用某個(gè)指定類的方法main啟動,傳遞給main一個(gè)字符串?dāng)?shù)組參數(shù),使指定的類被裝載,同時(shí)鏈接該類所使用的其它的類型,并且初始化它們。在Sun的虛擬機(jī)實(shí)現(xiàn)中,這個(gè)限制由字節(jié)碼驗(yàn)證器強(qiáng)制實(shí)行。例如,iadd指令將兩個(gè)整數(shù)相加。每個(gè)catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。動態(tài)鏈接方法和變量使得方法中使用的其它類的變化不會影響到本程序的代碼。局部變量都是32位的。Java虛擬機(jī)的寄存器有四種:1. pc: Java程序計(jì)數(shù)器;2. optop: 指向操作數(shù)棧頂端的指針;3. frame: 指向當(dāng)前執(zhí)行方法的執(zhí)行環(huán)境的指針;。Java方法區(qū)與傳統(tǒng)語言中的編譯后代碼或是Unix進(jìn)程中的正文段類似。例如,一個(gè)16位的參數(shù)存放時(shí)占用兩個(gè)字節(jié),其值為:第一個(gè)字節(jié)*256+第二個(gè)字節(jié)字節(jié)碼。Java指令集相當(dāng)于Java程序的匯編語言。每個(gè)JVM又包括方法區(qū)、堆、 Java棧、程序計(jì)數(shù)器和本地方法棧這五個(gè)部分,這幾個(gè)部分和類裝載機(jī)制與運(yùn)行引擎機(jī)制一起組成的體系結(jié)構(gòu)圖為:圖3JVM在它的生存周期中有一個(gè)明確的任務(wù),那就是運(yùn)行Java程序,因此當(dāng)Java程序啟動的時(shí)候,就產(chǎn)生JVM的一個(gè)實(shí)例;當(dāng)程序運(yùn)行結(jié)束的時(shí)候,該實(shí)例也跟著消失了。最后字節(jié)碼被裝入內(nèi)存,一旦字節(jié)碼進(jìn)入虛擬機(jī),它就會被解釋器解釋執(zhí)行,或者是被即時(shí)代碼發(fā)生器有選擇的轉(zhuǎn)換成機(jī)器碼執(zhí)行。它的下方是移植接口,移植接口由兩部分組成:適配器和Java操作系統(tǒng), 其中依賴于平臺的部分稱為適配器;JVM 通過移植接口在具體的平臺和操作系統(tǒng)上實(shí)現(xiàn);在JVM 的上方是Java的基本類庫和擴(kuò)展類庫以及它們的API, 利用Java API編寫的應(yīng)用程序(application) 和小程序(Java applet) 可以在任何Java平臺上運(yùn)行而無需考慮底層平臺, 就是因?yàn)橛蠮ava虛擬機(jī)(JVM)實(shí)現(xiàn)了程序與操作系統(tǒng)的分離,從而實(shí)現(xiàn)了Java 的平臺無關(guān)性。下面分別對這幾個(gè)部分進(jìn)行說明。虛擬機(jī)的內(nèi)層循環(huán)的執(zhí)行過程如下: do{ 取一個(gè)操作符字節(jié)。對于本地方法接口,實(shí)現(xiàn)JVM并不要求一定要有它的支持,甚至可以完全沒有。每個(gè)類文件包含了一個(gè)Java類或一個(gè)Java界面的編譯后的代碼。當(dāng)線程執(zhí)行Java方法的時(shí)候,它包含該線程正在被執(zhí)行的指令的地址。虛擬機(jī)提供了把局部變量中的值裝載到操作數(shù)棧的指令,也提供了把操作數(shù)棧中的值寫入局部變量的指令。異常捕捉異常情況在Java中被稱作Error(錯(cuò)誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態(tài)鏈接錯(cuò),如無法找到所需的class文件。如果找到了匹配的catch子句,那么系統(tǒng)轉(zhuǎn)移到指定的異常處理塊處執(zhí)行。如果錯(cuò)誤被傳播到最頂層,那么系統(tǒng)將調(diào)用一個(gè)缺省的異常處理塊。這兩個(gè)整數(shù)將從堆棧彈出、相加,并把結(jié)果壓回到操作數(shù)棧中。例如,本地棧是一個(gè)C語言的棧,那么當(dāng)C程序調(diào)用C函數(shù)時(shí),函數(shù)的參數(shù)以某種順序被壓入棧,結(jié)果則返回給調(diào)用函數(shù)。 i 。檢驗(yàn)檢查被裝載的主類的符號和語義,準(zhǔn)備則創(chuàng)建類或接口的靜態(tài)域以及把這些域初始化為標(biāo)準(zhǔn)的默認(rèn)值,解析負(fù)責(zé)檢查主類對其它類或接口的符號引用,在這一步它
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1