一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

Java的內存劃分全解析

時(shí)間:2024-08-02 02:13:41 JAVA認證 我要投稿
  • 相關(guān)推薦

Java的內存劃分全解析

  Java把內存劃分成兩種:一種是棧內存,一種是堆內存。以下是小編整理的Java的內存劃分全解析,希望對大家有所幫助。

  棧內存

  存放對象:函數中基本類(lèi)型的變量和對象的引用變量、靜態(tài)類(lèi)方法

  特點(diǎn):棧有一個(gè)很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時(shí)定義:

  inta=3;

  intb=3;

  編譯器先處理inta=3;首先它會(huì )在棧中創(chuàng )建一個(gè)變量為a的引用,然后查找棧中是否有3這個(gè)值,如果沒(méi)找到,就將3存放進(jìn)來(lái),然后將a指向3。

  接著(zhù)處理intb=3;在創(chuàng )建完b的引用變量后,因為在棧中已經(jīng)有3這個(gè)值,便將b直接指向3。這樣,就出現了a與b同時(shí)均指向3的情況。

  堆內存

  存放對象:用來(lái)存放由new創(chuàng )建的對象和數組。

  特點(diǎn):在堆中分配的內存,由Java虛擬機的自動(dòng)垃圾回收器來(lái)管理。

  在堆中產(chǎn)生了一個(gè)數組或對象后,還可以在棧中定義一個(gè)特殊的變量,讓棧中這個(gè)變量的取值等于數組或對象在堆內存中的首地址,棧中的這個(gè)變量就成了數組或對象的引用變量。

  引用變量就相當于是為數組或對象起的一個(gè)名稱(chēng),以后就可以在程序中使用棧中的引用變量來(lái)訪(fǎng)問(wèn)堆中的數組或對象。

  Q:static關(guān)鍵字,是一個(gè)修飾符,用于修飾成員(成員變量和成員函數),有什么特點(diǎn)

  A:1、想要實(shí)現對象中的共性數據的對象共享?梢詫⑦@個(gè)數據進(jìn)行靜態(tài)修飾。

  2、被靜態(tài)修飾的成員,可以直接被類(lèi)名所調用。也就是說(shuō),靜態(tài)的成員多了一種調用方式。類(lèi)名.靜態(tài)方式。

  3、靜態(tài)隨著(zhù)類(lèi)的加載而加載。而且優(yōu)先于對象存在。

  Java內存回收

  Java的內存分配和回收也主要在Java的堆上進(jìn)行的,Java的堆中存儲了大量的對象實(shí)例,所以Java的堆也叫GC堆。

  下面主要說(shuō)一下對于java堆的內存回收 。

  什么樣的內存可以回收

  判斷法1:引用計數

  方法:每有一個(gè)引用指向這個(gè)對象,那么這個(gè)對象的引用計數+1,反之,每有一個(gè)引用改變了指向,那么他原來(lái)指向的對象引用計數-1,當引用計數為0的時(shí)候,這個(gè)對象也就不可能被使用了那么就可以被回收了

  問(wèn)題:可能會(huì )出現環(huán)狀的引用,導致不可能被使用的對象永遠不可能被回收

  示例:

  Class A {

  A a;

  Public static void main(String[] args){

  A gc1 = new A();

  A gc2 = new A();

  Gc1.a = gc2;

  Gc2.a = gc1;

  Gc1= null;

  Gc2 = null;

  }

  Gc1和gc2都被設置成null了,他們都應該被清理,但是因為gc1的a對象指向gc2,gc2的a對象指向gc1,導致他們的引用計數永遠為1,但是他們都永遠不可能被使用了,所以這種方法存在漏洞

  判斷2:可達性分析算法

  方法:從一個(gè)叫做GC ROOTS的節點(diǎn)出發(fā),所有能夠到達的引用對象標記起來(lái),直到走到完全沒(méi)有引用的地方為止,這樣從這個(gè)節點(diǎn)連起來(lái)的所有的點(diǎn)(引用鏈),構成的路線(xiàn)就是不可回收的,那么所有沒(méi)有被到達過(guò)的對象均可以被回收

  什么可以做GC ROOTS:虛擬機棧(棧幀中的本地變量表)中的引用的對象、方法區中類(lèi)靜態(tài)屬性引用的對象、方法區中常量引用的對象、本地方法棧中JNI引用的對象

  這些對象的特點(diǎn):不可變并且隨時(shí)可能被用到,生命周期長(cháng)

  補充:可達性分析的算法,那么沒(méi)有在引用鏈上的對象都一定會(huì )被清理嗎?不一定。當運行可達性分析的算法之后,會(huì )對所有沒(méi)有在引用鏈上的對象進(jìn)行一次標記和篩選,篩選的條件為:該對象覆蓋了finallize()方法(這個(gè)方法是GC的時(shí)候如果這個(gè)對象要被回收則執行的方法,但是在Thinking in java中不推薦用來(lái)處理收尾工作),并且這個(gè)方法沒(méi)有被執行過(guò),那么就會(huì )把這個(gè)對象放到一個(gè)低優(yōu)先級隊列中執行,也就是這個(gè)對象的最后搶救的機會(huì ),如果這個(gè)時(shí)候這個(gè)對象把自己和在引用鏈上的引用連了起來(lái),那么他在執行完finallize方法之后,再次判斷時(shí)就不會(huì )被清理,否則會(huì )在第二次可達性判斷的時(shí)候直接清理(因為finallize已經(jīng)執行過(guò)一次了),如果沒(méi)有覆蓋這個(gè)方法,那么對不起,再見(jiàn)

  回收算法介紹:

  回收算法1:標記清理(Mark——sweep)算法

  標記所有需要回收對象,然后將他們清理回收

  問(wèn)題:會(huì )產(chǎn)生內存碎片

  優(yōu)點(diǎn):不需要暫停所有線(xiàn)程(Stop the world)

  回收算法2:復制

  標記后,將所有不需要回收的對象全部復制到一個(gè)空的內存中,然后清理剛剛使用的內存塊

  問(wèn)題:浪費資源,會(huì )有一些內存堆無(wú)法被使用

  解決:用在新生代,新生代會(huì )有80%以上的對象經(jīng)過(guò)一次GC就會(huì )死亡,因此采用Eden + Survivor * 2的辦法,Eden = 8 * Survivor大。℉otSpot默認),那么每次使用一個(gè)Eden + 一個(gè)Survivor,然后進(jìn)行復制清理的時(shí)候,清理Eden + Survivor中,然后將可用的對象復制到空閑的Survivor中,然后全部清空前面的使用區,然后使用Eden 和復制到的Survivor

  又一個(gè)問(wèn)題:如果Survivor不夠怎么辦?向老年代借空間,叫做分配擔保,不夠存放的對象會(huì )通過(guò)分配擔保進(jìn)入老年代

  問(wèn)題:需要 stop the world

  回收算法3:標記整理(Mark——compact)

  標記后,將可用內存向一側擺放,然后清理掉可用內存邊緣外部的所有內存區域

  優(yōu)點(diǎn):沒(méi)有內存碎片的問(wèn)題

  問(wèn)題:需要stop the world

  回收算法4:分代收集

  將堆分代(老年代、新生代),老年代采用標記整理、標記清理等方法,新生代采用復制方法。

  為什么:因為老年代大部分對象是可用的,因此如果采用復制算法,雖然沒(méi)有內存碎片,但是空間浪費大,而且大部分對象沒(méi)有變化,而在新生代使用復制算法,可以犧牲很小的內存空間就獲得較好的效率

  HotSpot中內存回收算法

  枚舉根節點(diǎn)(GC ROOTs)

  Java虛擬機采用準確式GC,有一個(gè)OOPmap來(lái)標記哪個(gè)位置有個(gè)對象,這樣在查找引用鏈的時(shí)候可以較快的找齊所有的引用鏈

  Safepoint

  在OOPmap的協(xié)助下,這個(gè)可以快速且準確的完成枚舉,但是問(wèn)題就是導致這個(gè)oopmap變化的指令非常多,如果為每一條指令生成oopmap,那么會(huì )需要大量額外空間,因此采用在特定點(diǎn)的地方生成,這些點(diǎn)同時(shí)也是safepoint的點(diǎn),那么當需要枚舉根節點(diǎn)的時(shí)候,就讓線(xiàn)程運行到這個(gè)地方再停止。

  一種方法:先停止所有線(xiàn)程,然后再讓沒(méi)有到安全點(diǎn)的線(xiàn)程自己跑到安全點(diǎn)再停下來(lái),基本不適用,搶先試中斷

  另一種方法:主動(dòng)式中斷,設置一個(gè)標記,在執行的時(shí)候去輪詢(xún),而需要中斷的時(shí)候,直接將這個(gè)位置的內存設置不可達,那么線(xiàn)程就會(huì )進(jìn)入一個(gè)自陷異常,就自己會(huì )中斷

【Java的內存劃分全解析】相關(guān)文章:

Java內存溢出的類(lèi)型10-03

客廳設計要點(diǎn)全解析07-21

JAVA垃圾收集算法與內存泄露的解決方法12-04

日本留學(xué)費用全解析10-05

java命令行參數解析201608-12

2017高考攝影藝考全解析01-07

2017藝考動(dòng)畫(huà)專(zhuān)業(yè)全解析01-07

加拿大中學(xué)留學(xué)申請全解析09-10

ERP人力資源管理全解析08-06

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看