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

詳解Java 中程序內存的分析

 更新時間:2017年04月23日 16:01:12   投稿:lqh  
這篇文章主要介紹了詳解Java 中程序內存的分析的相關資料,需要的朋友可以參考下

這篇文章將簡單的說明下當我們運行Java程序時JVM(Java虛擬機)的內存分配情況。

首先我們先來感觀的認識下幾個名詞:

1、棧,一般來說,基本數據類型直接在棧中分配空間,局部變量(在方法代碼段中定義的變量)也在棧中直接分配空間,當局部變量所在方法執(zhí)行完成之后該空間便立刻被JVM回收,還有一種是引用數據類型,即我們通常所說的需要用關鍵字new創(chuàng)建出來的對象所對應的引用也是在棧空間中,此時,JVM在??臻g中給對象引用分配了一個地址空間(相當于一個門牌號,通過這個門牌號就可以找到你家),在堆空間中給該引用的對象分配一個空間,??臻g中的地址引用指向了堆空間中的對象區(qū)(通過門牌號找住址);

2、堆,一般用來存放用關鍵字new出來的數據。

接下來我們再通過一段程序來直觀感受下程序運行時JVM的內存情況,

package demo;

public class Student {
  private String name;
  private int age;

  public void study() {
    System.out.println("I love study!");
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}
package demo;

public class StudentDemo {
  public static void main(String[] args) {
    Student student = new Student();

    System.out.println(student.getName() + ":" + student.getAge());
    student.setName("John");
    student.setAge(23);
    System.out.println(student.getName() + ":" + student.getAge());
    
    student.study();
    
    Student student2 = student;
    student2.setName("Jack");
    student2.setAge(25);
    System.out.println(student2.getName() + ":" + student2.getAge());
    System.out.println(student.getName() + ":" + student.getAge());
  }
}

當我們運行程序時,JVM會把Student類與StudentDemo類編譯完然后加載到JVM中一個叫方法區(qū)的地方,類的成員變量與成員方法也被加載到方法區(qū)中,此時內存模型如下

可以看到study方法右邊各有一個16進制的標記,而name與age變量沒有,這是因為每個對象都有各自的成員變量,而類中的成員方法卻可以被每個對象所共用,為了節(jié)省內存空間,JVM為方法分配了該標記(也叫內存地址)便于每個new出來的對象查找調用,接著JVM會自動尋找main方法,在棧中為main方法申請一個空間,這個過程也叫入棧,然后執(zhí)行我們Student類中第5行代碼,這時候,JVM在堆空間中分配一塊內存給Student對象,并為其分配一個內存地址(如果對象的成員變量沒有賦值,則JVM會為變量賦初始值),在棧中分配一塊內存空間用于指向堆空間中的Student對象區(qū)的內存地址,此時內存模型如下

接著看代碼第8行與第9行,程序為student對象的成員變量賦值,JVM會根據student所指向的地址在堆內存中尋找Student類的變量,并為變量賦新的值

第12行,這時student對象調用study方法,JVM在??臻g中為study方法申請了一塊內存空間

study方法執(zhí)行完后,立即釋放??臻g,代碼第14行,student2對象的引用指向了student所指向的地址

代碼15與16行,為student2的變量賦值,由于student2與student指向了同一個地方,所以這時student對象中變量的值也被改變

到這,main方法中所有代碼執(zhí)行完畢,main方法所占用的??臻g也被回收,而堆空間等待GC回收

代碼執(zhí)行結果如下:

null:0
John:23
I love study!
Jack:25
Jack:25

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • springboot實現(xiàn)郵箱驗證碼功能

    springboot實現(xiàn)郵箱驗證碼功能

    這篇文章主要為大家詳細介紹了springboot實現(xiàn)郵箱驗證碼功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • SpringBoot集成elasticsearch使用圖文詳解

    SpringBoot集成elasticsearch使用圖文詳解

    Spring Boot集成Elasticsearch其實非常簡單,這篇文章主要給大家介紹了關于SpringBoot集成elasticsearch使用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • log4j 詳解異步日志的配置和測試

    log4j 詳解異步日志的配置和測試

    這篇文章主要介紹了 log4j 詳解異步日志的配置和測試的相關資料,需要的朋友可以參考下
    2017-01-01
  • 詳解Spring如何解決循環(huán)引用的問題

    詳解Spring如何解決循環(huán)引用的問題

    在Spring框架中,當兩個或多個Bean之間存在相互依賴關系時,可能會導致循環(huán)引用的問題,循環(huán)引用指的是兩個或多個Bean之間互相依賴,形成一個循環(huán)鏈,本文將和大家一起探討Spring如何解決循環(huán)引用的問題,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • Java初學者常問的問題(推薦)

    Java初學者常問的問題(推薦)

    本文介紹一些Java初學者常問的問題,很多朋友對可以用%除以一個小數嗎? a += b 和 a = a + b 的效果有區(qū)別嗎? 聲明一個數組為什么需要花費大量時間? 為什么Java庫不用隨機pivot方式的快速排序?等等一系列問題有疑惑,下面就通過本文給大家詳細介紹下
    2017-03-03
  • SpringMVC使用第三方組件實現(xiàn)文件上傳

    SpringMVC使用第三方組件實現(xiàn)文件上傳

    這篇文章主要介紹了SpringMVC使用第三方組件實現(xiàn)文件上傳,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 淺談關于Java的GC垃圾回收器的一些基本概念

    淺談關于Java的GC垃圾回收器的一些基本概念

    這篇文章主要介紹了關于Java的GC垃圾回收器的一些基本概念,牽扯倒JVM內存模型的一些知識,需要的朋友可以參考下
    2015-11-11
  • Java的Hibernate框架中一對多的單向和雙向關聯(lián)映射

    Java的Hibernate框架中一對多的單向和雙向關聯(lián)映射

    建立對SQL語句的映射是Hibernate框架操作數據庫的主要手段,這里我們列舉實例來為大家講解Java的Hibernate框架中一對多的單向和雙向關聯(lián)映射
    2016-06-06
  • SpringSecurity 自定義認證登錄的項目實踐

    SpringSecurity 自定義認證登錄的項目實踐

    本文主要介紹了SpringSecurity 自定義認證登錄的項目實踐,以手機驗證碼登錄為例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • Spring Boot Admin 的使用詳解

    Spring Boot Admin 的使用詳解

    這篇文章主要介紹了Spring Boot Admin 的使用詳解,Spring Boot Admin 用于監(jiān)控基于 Spring Boot 的應用,有興趣的可以了解一下
    2017-09-09

最新評論