欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的內(nèi)存機(jī)制詳解

 更新時(shí)間:2017年03月17日 11:50:23   作者:·水龍吟·  
本文主要介紹了Java的內(nèi)存機(jī)制的相關(guān)知識(shí),具有很好的參考價(jià)值,下面跟著小編一起來看下吧

Java把內(nèi)存分為兩種:一種是棧內(nèi)存,另一種是堆內(nèi)存。在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配,當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java 就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過變量的作用域后(比如,在函數(shù)A中調(diào)用函數(shù)B,在函數(shù)B中定義變量a,變量a的作用域只是函數(shù)B,在函數(shù)B運(yùn)行以后,變量a會(huì)自動(dòng)被銷毀。分配給它的內(nèi)存會(huì)被回收),Java會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即另做他用。

堆內(nèi)存用來存放由new創(chuàng)建的內(nèi)存數(shù)組,在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來管理。在堆中產(chǎn)生一個(gè)數(shù)組或?qū)ο笾?,還可以在棧中定義一個(gè)特殊的變量,讓棧中的這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個(gè)變量就變成了數(shù)組或?qū)ο蟮囊米兞?,以后就可以在程序中使用棧中的變量來訪問堆中的數(shù)組或者對(duì)象,引用變量就相當(dāng)于為數(shù)組或者對(duì)象起的一個(gè)名字。引用變量是普通的變量,定義時(shí)在棧中分配,引用變量在程序運(yùn)行到其他作用域之外后邊釋放。而數(shù)組和對(duì)象本省在堆中分配,即使程序運(yùn)行到使用new產(chǎn)生的數(shù)組或者對(duì)象的語句所在的代碼塊之外,數(shù)組和對(duì)象本省占據(jù)的內(nèi)存不會(huì)被釋放。數(shù)組和對(duì)象在沒有引用變量指向它的時(shí)候,才變?yōu)槔?,不能再被使用,在隨后的一個(gè)不確定時(shí)間被垃圾回收器收走(釋放掉)。這也是Java比較占內(nèi)存的原因,實(shí)際上,棧中的變量指向堆內(nèi)存中的變量,這就是Java中的指針。

代碼實(shí)例Demo1:單個(gè)對(duì)象創(chuàng)建

class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年齡:"+age);
 }
}
public class Demo1 {
 public static void main(String[] args) {
  Person per = new Person() ;
 }
}

在上述程序中實(shí)例化了一個(gè)對(duì)象per,在實(shí)例化的過程中需要再內(nèi)存中開辟空間,這其中就包括棧內(nèi)存和堆內(nèi)存,具體的內(nèi)存分配如下圖所示:

 圖1-1 對(duì)象的實(shí)例化過程

我們可以從上圖中發(fā)現(xiàn),對(duì)象名稱per被保存在了棧內(nèi)存中(更加準(zhǔn)確的說法是,在棧內(nèi)存中保存的是堆內(nèi)存空間的訪問地址),而對(duì)象的具體內(nèi)容,比如屬性name和age,被保存在堆內(nèi)存中。因?yàn)閜er對(duì)象只是被實(shí)例化,還沒有被具體賦值,所以都是默認(rèn)值。字符串的默認(rèn)值為null,int的類型的默認(rèn)值為0。前面已經(jīng)提到,堆內(nèi)存空間必須使用new關(guān)鍵字才能開辟。

代碼實(shí)例Demo2:多個(gè)對(duì)象創(chuàng)建

class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年齡:"+age);
 }
}
public class Demo2 {
 public static void main(String[] args) {
  Person per1 = new Person() ;
  Person per2 = new Person() ;
  per1.name="張三" ;
  per1.age=30 ;
  per2.age=33 ;
  per1.tell(); 
  per2.tell(); 
 }
}

圖1-2 實(shí)例化兩個(gè)對(duì)象

關(guān)鍵概念:類跟數(shù)組一樣,都是屬于引用類型,引用類型就是指同一個(gè)堆內(nèi)存可以被多個(gè)棧內(nèi)存指向,下面來看一下引用傳遞的簡(jiǎn)單實(shí)例。

代碼實(shí)例Demo3:對(duì)象引用傳遞1

class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年齡:"+age);
 }
}
public class Demo3 {
 public static void main(String[] args) {
  Person per1 = new Person() ;
  Person per2 = per1 ;//-------注意--------
  per1.name="張三" ;
  per1.age=30 ;
  per2.age=33 ;
  per1.tell(); 
  per2.tell(); 
 }
}

程序運(yùn)行結(jié)果為:

從程序的運(yùn)行結(jié)果可以發(fā)現(xiàn),兩個(gè)對(duì)象輸出的內(nèi)容一樣,實(shí)際上所謂的引用傳遞,就是將一個(gè)堆內(nèi)存空間的使用權(quán)交給多個(gè)棧內(nèi)存空間,每個(gè)棧內(nèi)存空間都可以修改堆內(nèi)存空間的內(nèi)容,此程序的內(nèi)存分配圖如下所示:

圖1-3 對(duì)象引用的傳遞內(nèi)存分配

 

圖1-3 對(duì)象引用的傳遞內(nèi)存分配(續(xù))

注意:上述實(shí)例中對(duì)象per2沒有堆內(nèi)存空間,這是因?yàn)閷?duì)象per2只進(jìn)行聲明操作,也沒有進(jìn)行實(shí)例化操作。只是使用new關(guān)鍵字,實(shí)例化以后才會(huì)有堆內(nèi)存空間

代碼實(shí)例Demo4:對(duì)象引用傳遞2

 class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年齡:"+age);
 }
}
public class Demo4 {
 public static void main(String[] args) {
  Person per1 = new Person() ;
  Person per2 = new Person() ;
  per1.name="張三" ;
  per1.age=30 ;
  per2.name="李四" ;
  per2.age=33 ;
  per2=per1 ;//-----注意----
  per1.tell(); 
  per2.tell(); 
 }
}

上述運(yùn)行程序結(jié)果為:

從程序的輸出結(jié)果可以發(fā)現(xiàn)跟Demo3差不多。不過內(nèi)存分配發(fā)生了一些變化,具體如下所示:

圖1-4 (垃圾對(duì)象)的產(chǎn)生

注意點(diǎn):

1.Java本身提供垃圾收集機(jī)制(Garbage Collection,GC),會(huì)不定期釋放不用的內(nèi)存空間,只要對(duì)象不用了,就會(huì)等待GC釋放空間,如上面堆內(nèi)存中的name="李四";age=33。

2.一個(gè)棧內(nèi)存只能指向一個(gè)堆內(nèi)存空間,如果要想指向其他堆內(nèi)存空間,則必須先斷開已有的指向,才能分配新的指向。

Java中常見的內(nèi)存區(qū)域

在Java中主要存在4塊內(nèi)存空間,這些內(nèi)存的名稱及作用如下:

  1.棧內(nèi)存空間:保存所有對(duì)象的名稱。

  2.堆內(nèi)存空間:保存每個(gè)對(duì)象的具體屬性內(nèi)容。

  3.全局?jǐn)?shù)據(jù)區(qū):保存static類型的屬性值。

  4.全局代碼區(qū):保存所有的方法定義。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Java深入講解Object類常用方法的使用

    Java深入講解Object類常用方法的使用

    前面java繼承中說到的Object類是java中一個(gè)特殊的類,所有的類都是直接或者間接的繼承自O(shè)bject類,即如果某個(gè)類沒有使用extends關(guān)鍵字則默認(rèn)是java.lang.Object類的子類,所以所有的類都可以使用Object類中定義的方法,下面介紹Object類的常用方法
    2022-04-04
  • JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

    JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

    這篇文章主要介紹了JavaEE Spring MyBatis是什么? 它和Hibernate的區(qū)別有哪些?如何配置MyBatis?本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java數(shù)組常見應(yīng)用詳解【創(chuàng)建、遍歷、排序、查找】

    Java數(shù)組常見應(yīng)用詳解【創(chuàng)建、遍歷、排序、查找】

    這篇文章主要介紹了Java數(shù)組常見應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了java數(shù)組的基本定義、創(chuàng)建、遍歷、排序、查找等相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • java swing標(biāo)準(zhǔn)對(duì)話框具體實(shí)現(xiàn)

    java swing標(biāo)準(zhǔn)對(duì)話框具體實(shí)現(xiàn)

    這篇文章介紹了swing標(biāo)準(zhǔn)對(duì)話框的具體實(shí)現(xiàn)方法,有需要的朋友可以參考一下
    2013-06-06
  • 解決response.setHeader設(shè)置下載文件名無效的問題

    解決response.setHeader設(shè)置下載文件名無效的問題

    這篇文章主要介紹了解決response.setHeader設(shè)置下載文件名無效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java輸出鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)

    Java輸出鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)

    這篇文章主要介紹了Java輸出鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)的相關(guān)內(nèi)容,涉及三種設(shè)計(jì)思路及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Java案例分享-集合嵌套

    Java案例分享-集合嵌套

    這篇文章主要介紹了Java案例分享-集合嵌套,通過案例創(chuàng)建一個(gè)ArrayList集合,存儲(chǔ)三個(gè)元素,每一個(gè)元素都是HashMap,每一個(gè)HashMap的鍵和值都是String,并遍歷,實(shí)際操作內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • Java中冒泡排序的原生實(shí)現(xiàn)方法(正序與逆序)

    Java中冒泡排序的原生實(shí)現(xiàn)方法(正序與逆序)

    這篇文章主要給大家介紹了關(guān)于Java中冒泡排序的原生實(shí)現(xiàn)方法(正序與逆序)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 淺談Spring Boot Web 應(yīng)用性能優(yōu)化

    淺談Spring Boot Web 應(yīng)用性能優(yōu)化

    這篇文章主要介紹了淺談Spring Boot Web 應(yīng)用性能優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java CompletableFuture使用方式

    Java CompletableFuture使用方式

    這篇文章主要介紹了Java CompletableFuture使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論