奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語言

java垃圾回收機制是怎樣的

時間:2025-01-23 06:33:19 java語言 我要投稿
  • 相關(guān)推薦

java垃圾回收機制是怎樣的

  手動管理內(nèi)存

java垃圾回收機制是怎樣的

  在介紹現(xiàn)代版的垃圾回收之前,我們先來簡單地回顧下需要手動地顯式分配及釋放內(nèi)存的那些日子。如果你忘了去釋放內(nèi)存,那么這塊內(nèi)存就無法重用了。這塊內(nèi)存被占有了卻沒被使用。這種場景被稱之為內(nèi)存泄露。

  下面是用C寫的一個手動管理內(nèi)存的簡單例子:

  int send_request()

  {

  size_t n = read_size();

  int *elements = malloc(n * sizeof(int));

  if(read_elements(n, elements) < n)

  { // elements not freed! return -1; } // … free(elements)

  return 0;}

  可以看到,你很容易就會忘了釋放內(nèi)存。內(nèi)存泄露曾經(jīng)是個非常普遍的問題。你只能通過不斷地修復(fù)自己的代碼來與它們進(jìn)行抗?fàn)帯R虼,需要有一種更優(yōu)雅的方式來自動釋放無用內(nèi)存,以便減少人為錯誤的可能性。這種自動化過程又被稱為垃圾回收(簡稱GC)。

  智能指針

  自動垃圾回收早期的一種實現(xiàn)便是引用計數(shù)。你知曉每一個對象被引用了幾次,當(dāng)計數(shù)器歸0的時候,這個對象就可以被安全地回收掉了。C++的共享指針就是一個非常著名的例子:

  11int send_request() { size_t n = read_size(); stared_ptrelements = make_shared(); if(read_elements(n, elements) < n) { return -1; } return 0;}

  我們使用的sharedptr會記錄這個對象被引用的次數(shù)。如果你將它傳遞給別人則計數(shù)加一,當(dāng)它離開了作用域后便會減一。一旦這個計數(shù)為0,sharedptr會自動地刪除底層對應(yīng)的vector。當(dāng)然這只是個示例,因為也有讀者指出來了,這個在現(xiàn)實中是不太可能出現(xiàn)的,但作為演示是足夠了。

  自動內(nèi)存管理

  在上面的C++代碼中,我們還得顯式地聲明我們需要使用內(nèi)存管理。那如果所有的對象都采用這個機制會怎樣呢?那簡直就太方便了,這樣開發(fā)人員便無需 考慮清理內(nèi)存的事情了。運行時會自動知曉哪些內(nèi)存不再使用了,然后釋放掉它。也就是說,它自動地回收了這些垃圾。第一代的垃圾回收器是1959年Lisp 引入的,這項技術(shù)迄今為止一直在不斷演進(jìn)。

  引用計數(shù)

  剛才我們用C++的共享指針?biāo)菔镜南敕ǹ梢詰?yīng)用到所有的對象上來。許多語言比如說Perl, Python以及PHP,采用的都是這種方式。這個通過一張圖可以很容易說明:

  綠色的云代表的是程序中仍在使用的對象。從技術(shù)層面上來說,這有點像是正在執(zhí)行的某個方法里面的局部變量,亦或是靜態(tài)變量之類的。不同編程語言的情況可能會不一樣,因此這并不是我們關(guān)注的重點。

  藍(lán)色的圓圈代表的是內(nèi)存中的對象,可以看到有多少對象引用了它們;疑珗A圈的對象是已經(jīng)沒有任何人引用的了。因此,它們屬于垃圾對象,可以被垃圾回收器清理掉。

  看起來還不錯對吧?沒錯,不過這里存在著一個重大的缺陷。很容易會出現(xiàn)一些孤立的環(huán),它們中的對象都不在任何域內(nèi),但彼此卻互相引用導(dǎo)致引用數(shù)不為0。下面便是一個例子:

  看到了吧,紅色部分其實就是應(yīng)用程序不再使用的垃圾對象。由于引用計數(shù)的缺陷,因此會存在內(nèi)存泄露。

  有幾種方法可以解決這一問題,比如說使用特殊的“弱”引用,或者使用一個特殊的算法回收循環(huán)引用。之前提到的Perl,Python以及PHP等語言,都是使用類似的方法來回收循環(huán)引用的,不過這已經(jīng)超出本文講述的范圍了。我們準(zhǔn)備詳細(xì)介紹下JVM所采用的方法。

  標(biāo)記刪除

  首先,JVM對于對象可達(dá)性的定義要明確一些。它可不像前面那樣用綠色的云便含煳了事的,而是有著非常明確及具體的垃圾回收根對象(Garbage Collection Roots)的定義:

  局部變量

  活動線程

  靜態(tài)字段

  JNI引用

  其它(后面將會討論到)

  JVM通過標(biāo)記刪除的算法來記錄所有可達(dá)(存活)對象,同時確保不可達(dá)對象的那些內(nèi)存能夠被重用。這包含兩個步驟:

  標(biāo)記是指遍歷所有可達(dá)對象,然后在本地內(nèi)存中記錄這些對象的信息

  刪除會確保不可達(dá)對象的內(nèi)存地址可以在下一次內(nèi)存分配中使用。

  JVM中的不同GC算法,比如說Parallel Scavenge,Parallel Mark+Copy, CMS都是這一算法的不同實現(xiàn),只是各階段略有不同而已,從概念上來講仍然是對應(yīng)著上面所說的那兩個步驟。

  這種實現(xiàn)最重要的就是不會再出現(xiàn)泄露的對象環(huán)了:

  缺點就是應(yīng)用程序的線程需要被暫停才能完成回收,如果引用一直在變的話你是無法進(jìn)行計數(shù)的。這個應(yīng)用程序被暫停以便JVM可以收拾家務(wù)的情況又被稱為Stop The World pause(STW)。這種暫停被觸發(fā)的可能性有很多,不過垃圾回收應(yīng)該是最常見的一種。

【java垃圾回收機制是怎樣的】相關(guān)文章:

java垃圾回收機制06-28

java垃圾回收算法講解01-16

java垃圾回收的方法是什么07-31

總結(jié)Java垃圾回收器的方法和原理06-17

Java內(nèi)存回收07-17

Java反射機制07-02

java的緩存機制07-29

Java 語言與C語言中垃圾回收的不同方式03-12

java中反射機制05-26

主站蜘蛛池模板: 始兴县| 疏勒县| 崇阳县| 松潘县| 南充市| 古蔺县| 丹阳市| 鄂托克前旗| 乐陵市| 军事| 沈阳市| 章丘市| 将乐县| 汝州市| 弋阳县| 嘉荫县| 庄河市| 乾安县| 武定县| 三河市| 乐清市| 潮州市| 开远市| 宁夏| 维西| 广德县| 黄冈市| 长顺县| 昭苏县| 迁安市| 鄂托克旗| 阜阳市| 湘乡市| 荔浦县| 贵州省| 仁布县| 威信县| 三穗县| 梓潼县| 曲阜市| 北海市|