最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的內存機制詳解

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

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

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

代碼實例Demo1:單個對象創(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() ;
 }
}

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

 圖1-1 對象的實例化過程

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

代碼實例Demo2:多個對象創(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ù)組一樣,都是屬于引用類型,引用類型就是指同一個堆內存可以被多個棧內存指向,下面來看一下引用傳遞的簡單實例。

代碼實例Demo3:對象引用傳遞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(); 
 }
}

程序運行結果為:

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

圖1-3 對象引用的傳遞內存分配

 

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

注意:上述實例中對象per2沒有堆內存空間,這是因為對象per2只進行聲明操作,也沒有進行實例化操作。只是使用new關鍵字,實例化以后才會有堆內存空間

代碼實例Demo4:對象引用傳遞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(); 
 }
}

上述運行程序結果為:

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

圖1-4 (垃圾對象)的產生

注意點:

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

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

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

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

  1.棧內存空間:保存所有對象的名稱。

  2.堆內存空間:保存每個對象的具體屬性內容。

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

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • SpringBoot中的掃描注解使用詳解

    SpringBoot中的掃描注解使用詳解

    為了使Spring Boot應用程序能夠掃描并識別特定或自定義注解,通常的做法是在創(chuàng)建這些注解之后,在配置類中通過@ComponentScan指定基礎包路徑,并設置過濾條件來包含所需的注解,本文給大家介紹了Spring Boot中的掃描注解如何使用,需要的朋友可以參考下
    2025-01-01
  • Java?中如何創(chuàng)建按鈕單擊事件

    Java?中如何創(chuàng)建按鈕單擊事件

    我們使用事件偵聽器在Java中創(chuàng)建按鈕單擊事件,本文給大家講解Java中的按鈕單擊事件,結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • java程序員必須知道的4個書寫代碼技巧

    java程序員必須知道的4個書寫代碼技巧

    本篇文章主要給大家講述了作為JAVA程序員如何能寫出高效的代碼以及運行效率更高的代碼,一起學習分享下吧。
    2017-12-12
  • 用Java設計實現(xiàn)多實例多庫查詢方式

    用Java設計實現(xiàn)多實例多庫查詢方式

    這篇文章主要介紹了用Java設計實現(xiàn)多實例多庫查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java實現(xiàn)橋接方法isBridge()和合成方法isSynthetic()

    Java實現(xiàn)橋接方法isBridge()和合成方法isSynthetic()

    本文主要介紹了Java實現(xiàn)橋接方法isBridge()和合成方法isSynthetic(),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • java實現(xiàn)簡單猜數(shù)字

    java實現(xiàn)簡單猜數(shù)字

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單猜數(shù)字,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • PowerJob?AbstractSqlProcessor方法工作流程源碼解讀

    PowerJob?AbstractSqlProcessor方法工作流程源碼解讀

    這篇文章主要為大家介紹了PowerJob?AbstractSqlProcessor方法工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • java設計優(yōu)化之代理模式

    java設計優(yōu)化之代理模式

    這篇文章主要為大家詳細介紹了java設計優(yōu)化中的代理模式,感興趣的朋友可以參考一下
    2016-03-03
  • IDEA實現(xiàn)序列化時如何自動生成serialVersionUID的步驟

    IDEA實現(xiàn)序列化時如何自動生成serialVersionUID的步驟

    這篇文章主要介紹了IDEA實現(xiàn)序列化時如何自動生成serialVersionUID的步驟,首先安裝GenerateSerialVersionUID插件,當出現(xiàn)添加serialVersionUID選項,選中則會自動生成serialVersionUID,感興趣的朋友一起學習下吧
    2024-02-02
  • MyBatis-Plus中的邏輯刪除使用詳解

    MyBatis-Plus中的邏輯刪除使用詳解

    開發(fā)系統(tǒng)時,有時候在實現(xiàn)功能時,刪除操作需要實現(xiàn)邏輯刪除就是將數(shù)據標記為刪除,而并非真的物理刪除(非DELETE操作),查詢時需要攜帶狀態(tài)條件,確保被標記的數(shù)據不被查詢到。這樣做的目的就是避免數(shù)據被真正的刪除
    2022-12-12

最新評論

仪征市| 株洲市| 萍乡市| 沁水县| 凌源市| 通城县| 九寨沟县| 陇南市| 娱乐| 富民县| 商都县| 芷江| 沧州市| 龙川县| 安溪县| 汉沽区| 桐梓县| 苍山县| 河西区| 郴州市| 时尚| 泌阳县| 米脂县| 伊春市| 平远县| 宝坻区| 南雄市| 理塘县| 富平县| 洛浦县| 土默特右旗| 义乌市| 井研县| 高台县| 察哈| 策勒县| 青海省| 台中市| 虹口区| 万荣县| 寿宁县|