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

正文內容

java虛擬機詳解(參考版)

2025-07-01 08:27本頁面
  

【正文】 對象已死?而Java堆和方法區(qū)(包括運行時常量池)則不一樣,我們必須等到程序實際運行期間才能知道會創(chuàng)建哪些對象,這部分內存的分配和回收都是動態(tài)的,我們本文后續(xù)討論中的“內存”分配與回收僅僅指這一部分內存?! “褧r間從1960年撥回現(xiàn)在,回到我們熟悉的Java語言?! 〗涍^半個世紀的發(fā)展,目前的內存分配策略與垃圾回收技術已經相當成熟,一切看起來都進入“自動化”的時代,那為什么我們還要去了解GC和內存分配?答案很簡單:當需要排查各種內存溢出、泄漏問題時,當垃圾收集成為系統(tǒng)達到更高并發(fā)量的瓶頸時,我們就需要對這些“自動化”的技術有必要的監(jiān)控、調節(jié)手段。事實上GC的歷史遠遠比Java來得久遠,在1960年誕生于MIT的Lisp是第一門真正使用內存動態(tài)分配和垃圾收集技術的語言。概述:JVM內存管理:深入垃圾收集器與內存分配策略Java與C++之間有一堵由內存動態(tài)分配和垃圾收集技術所圍成的高墻,墻外面的人想進去,墻里面的人卻想出來。所以簡單來說,volatile適合這種場景:一個變量被多個線程共享,線程直接給這個變量賦值。涉及到給a賦值和將a同步回主存的步驟,這個順序可能被打亂。6. }}5. setA(intpublic3. intpublic2. VolatileTest{1. public2)該變量沒有包含在具有其他變量的不變式中所以,volatile的使用場景是有限的,在有限的一些情形下可以使用 volatile 變量替代鎖。 當一個VolatileTest對象被多個線程共享,a的值不一定是正確的,因為a=a+count包含了好幾步操作,而此時多個線程的執(zhí)行是無序的,因為沒有任何機制來保證多個線程的執(zhí)行有序性和原子性。6. }}5. 4. count){voida。volatileclass什么意思呢?假如有這樣的代碼:Java代碼任何被volatile修飾的變量,都不拷貝副本到工作內存,任何修改都及時寫在主存。 volatile是java提供的一種同步手段,只不過它是輕量級的同步,為什么這么說,因為volatile只能保證多線程的內存可見性,不能保證多線程的執(zhí)行有序性。整個過程都保證了放雞蛋,拿雞蛋,放雞蛋,拿雞蛋。4 假設接著來了線程A,就重復2;假設來料線程B,就重復3。2 ,()不為0,調用wait()方法,自己進入了鎖對象的阻塞隊列。聲明一個Plate對象為plate,被線程A和線程B共享,A專門放雞蛋,B專門拿雞蛋。notify()。26. //往盤子里放雞蛋}catch(InterruptedException22. 21. try{20. If(()0){19. egg){voidsynchronized18. 17. 16. }return15. //喚醒阻塞隊列的某線程到就緒隊列()。13. Object12. 11. }}catch(InterruptedException8. 5. getEgg(){public4. eggs=newclass1. package()則會通知阻塞隊列的某個線程進入就緒隊列。6. }5. //這里放棄了同步鎖,好不容易得到,又放棄了num。balancebalance(lock)2. //聲明了一個對象作為鎖lock=new看這個代碼片段:Java代碼如何讓線程主動釋放鎖很簡單,調用鎖的wait()方法就好。 假設有這樣一種情況,有一個桌子,桌子上面有一個盤子,盤子里只能放一顆雞蛋,A專門往盤子里放雞蛋,如果盤子里有雞蛋,則一直等到盤子里沒雞蛋,B專門從盤子里拿雞蛋,如果盤子里沒雞蛋,則等待直到盤子里有雞蛋。 生產者/消費者模式其實是一種很經典的線程同步模型,很多時候,并不是光保證多個線程對某共享資源操作的互斥性就夠了,往往多個線程之間都是有協(xié)作的。生產者/消費者模式如果恰好在這個時候,因為線程a已經獲得了鎖還沒有釋放,所以線程b要進入account的就緒隊列,等到得到鎖后才可以執(zhí)行。 每個鎖對象都有兩個隊列,一個是就緒隊列,一個是阻塞隊列,就緒隊列存儲了將要獲得鎖的線程,阻塞隊列存儲了被阻塞的線程,當一個被線程被喚醒(notify)后,才會進入到就緒隊列,等待cpu的調度。每個線程都有自己的lock,根本不存在鎖競爭。8. }}7. }//do5. (lock){4. lock=new3. test(){public2. ThreadTest{1. public 理論上,每個對象都可以做為鎖,但一個對象做為鎖時,應該被多個線程共享,這樣才顯得有意義,在并發(fā)環(huán)境下,一個沒有共享的對象作為鎖是沒有意義的。 static synchronized void add(int num),那么鎖就是這個方法所在的class。那么對于public synchronized void add(int num)這種情況,意味著什么呢?其實這種情況,鎖就是這個方法所在的對象。剛才不是說了synchronized的用法是這樣的嗎:Java代碼num。balancebalancenum)void4. public3. }+=2. {add(intsynchronized為了保證銀行賬戶的安全,可以操作賬戶的方法如下:Java代碼3. }臨界區(qū)代碼典型的用法如下:Java代碼 上面說了,java用synchronized關鍵字做為多線程并發(fā)環(huán)境的執(zhí)行有序性的保證手段之一。synchronized關鍵字這是java同步產生的根源,synchronized關鍵字保證了多個線程對于同步塊是互斥的,synchronized作為一種同步手段,解決java多線程的執(zhí)行有序性和內存可見性,而volatile關鍵字之解決多線程的內存可見性問題。63. }}62. }61. }60. i++)100000。i0。ifor58. {voidamount。54. =amount)account,public52. 51. int50. Account49. {implementsclass(amount)。43. {=(intrun()public41. 40. }39. =account。37. {intAddThread(Accountamount。account。RunnableAddThreadstatic32. 31. }30. ()。28. ()。26. withdraw)。WithdrawThread(account,newbadd)。AddThread(account,newaAccount(1000)。=Account22. {throwsmain(String[]staticnum。balancebalance18. {withdraw(intpublic17. 16. }15. +=num)voidbalance。getBalance()public9. 8. }7. =balance)public5. 4. intAccount1. public同樣,x有可能為11,如果x是一個銀行賬戶,線程a存款,線程b扣款,顯然這樣是有嚴重問題的,要解決這個問題,必須保證線程a和線程b是有序執(zhí)行的,并且每個線程執(zhí)行的加1或減1是一個原子操作。那么顯然,最終的x的值是不可靠的。從上面的描述中可以知道x=x+1并不是一個原子操作,它的執(zhí)行過程如下:1 從主存中讀取變量x副本到工作內存2 給x加13 將x加1后的值寫回主線程有可能只對工作內存中的副本進行賦值,只到最后一次賦值后才同步到主存儲區(qū),所以assign,store,weite順序可以由JVM實現(xiàn)系統(tǒng)決定。a++。i10。1. for(int 當同一線程再度引用該字段時,有可能重新從主存中獲取變量副本(readloaduse),也有可能直接引用原來的副本(use),也就是說 read,load,use順序可以由JVM實現(xiàn)系統(tǒng)決定。那么,什么是有序性呢(3) 用工作內存數(shù)據(jù)刷新主存相關內容 (store and write)JVM規(guī)范定義了線程對主存的操作指令:read,load,use,assign,store,write。(1) 從主存復制變量到當前工作內存 (read and load)當new一個對象的時候,也是被分配在主內存中,每個線程都有自己的工作內存,工作內存存儲了主存的某些對象的副本,當然線程的工作內存大小是有限制的。多個線程之間是不能互相傳遞數(shù)據(jù)通信的,它們之間的溝通只能通過共享變量來進行。我們都知道計算機有高速緩存的存在,處理器并不是每次處理數(shù)據(jù)都是取內存的。其實java的多線程并發(fā)問題最終都會反映在java的內存模型上,所謂線程安全無非是要控制多個線程對某個資源的有序訪問或修改。淺談java內存模型后面我還會寫java并發(fā)包的文章,詳細總結如何利用java并發(fā)包編寫高效安全的多線程并發(fā)程序。我認為要認識java線程安全,必須了解兩個主要的點:java的內存模型,java的線程同步機制。本人jameswxx原創(chuàng)文章,轉載請注明出處,我費了很多心血,多謝了。java線程安全,java垃圾收集,java并發(fā)包詳細介紹,java profile和jvm性能調優(yōu)java線程安全總結最近想將java基礎的一些東西都整理整理,寫下來,這是對知識的總結,也是一種樂趣??偨Y到此為止,我們弄清楚虛擬機里面的內存是如何劃分的,哪部分區(qū)域,什么樣的代碼、操作可能導致OOM異常。at (:20)運行結果:Exception in thread main }while (true) {(true)。private static final int _1MB = 1024 * 1024。*/public class DirectMemoryOOM {* VM Args:Xmx20M XX:MaxDirectMemorySize=10M本機直接內存at (:616)at (Native Method)}}static class OOMObject {}()。})。return (obj, args)。while (true) {public static void main(String[] args) {*/public class JavaMethodAreaOOM {XX:PermSize=10M XX:MaxPermSize=10M清單5:借助CGLib使得方法區(qū)出現(xiàn)OOM異常/**上文講過,方法區(qū)用于存放Class相關信息,所以這個區(qū)域的測試我們借助CGLib直接操作字節(jié)碼動態(tài)生成大量的Class,值得注意的是,這里我們這個例子中模擬的場景其實經常會在實際應用中出現(xiàn):當前很多主流框架,如Spring、Hibernate對類進行增強時,都會使用到CGLib這類字節(jié)碼技術,當增強的類越多,就需要越大的方法區(qū)用于保證動態(tài)生成的Class可以加載入內存。at (Native Method)}}((i++).intern())。int i = 0。// 10M的PermSize在integer范圍內足夠產生OOM了//public static void main(String[] args) {*/public class RuntimeConstantPoolOOM {* VM Args:XX:PermSize=10M XX:MaxPermSize=10M實現(xiàn)代碼如下:要在常量池里添加內容,()這個Native方法。}}()。}}public void run() {OverrideThread thread = new Thread(new Runnable() {}while (true) {private void dontStop() {*/public class JavaVMStackOOM {(這時候不妨設大些)清單3:創(chuàng)建線程導致OOM異常/**原因其實很好理解,操作系統(tǒng)分配給每個進程的內存是有限制的,譬如32位Windows限制為2G,Java堆和方法區(qū)的大小JVM有參數(shù)可以限制最大值,那剩余的內存為2G(操作系統(tǒng)限制)Xmx(最大堆)MaxPermSize(最大方法區(qū)),程序計數(shù)器消耗內存很小,可以忽略掉,那虛擬機進程本身耗費的內存不計算的話,剩
點擊復制文檔內容
范文總結相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1