java中棧內存可以存儲常量嗎(java類在內存中的存儲)

  • 1、java中棧內存可以存儲常量嗎
  • 2、java中的String常量是存放在棧中還是堆中?
  • 3、java 常量池 到底是在堆中還是棧中?
  • 4、java中的棧只存儲局部變量嗎?
  • 5、java中 關於常量池 棧內存 堆內存
  • 6、Java中,實例中的常量是在堆中還是方法區

一個完整的Java程序運行過程會涉及以下內存區域:

寄存器:JVM內部虛擬寄存器,存取速度非常快,程序不可控制。

棧:保存局部變量的值,包括:1.用來保存基本數據類型的值;2.保存類的實例,即堆區對象的引用(指針)。也可以用來保存加載方法時的幀。

堆:用來存放動態產生的數據,比如new出來的對象。注意創建出來的對象只包含屬於各自的成員變量,並不包括成員方法。因為同一個類的對象擁有各自的成員變量,存儲在各自的堆中,但是他們共享該類的方法,並不是每創建一個對象就把成員方法複製一次。

常量池:JVM為每個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、字段的符號引用。池中的數據和數組一樣通過索引訪問。由於常量池包含了一個類型所有的對其他類型、方法、字段的符號引用,所以常量池在Java的動態鏈接中起了核心作用。常量池存在於堆中。

代碼段:用來存放從硬盤上讀取的源程序代碼。

數據段:用來存放static定義的靜態成員。

對於局部變量,如果是基本類型,會把值直接存儲在棧;如果是引用類型,比如String s = new String(“william”);會把其對象存儲在堆,而把這個對象的引用(指針)存儲在棧。

再如

String s1 = new String(“william”);

String s2 = s1;

s1和s2同為這個字符串對象的實例,但是對象只有一個,存儲在堆,而這兩個引用存儲在棧中。

類的成員變量在不同對象中各不相同,都有自己的存儲空間(成員變量在堆中的對象中),基本類型和引用類型的成員變量都在這個對象的空間中,作為一個整體存儲在堆。而類的方法卻是該類的所有對象共享的,只有一套,對象使用方法的時候方法才被壓入棧,方法不使用則不佔用內存。

系統內存一般情況來說分為四個

heap 堆 放 對象 也就是new 出來的東西

stack 棧 放局部變量

static segment 靜態區 用來放 靜態變量 和字符串常量

data segement 代碼區 用來放代碼的

如果 一個字符串是 String s = “abc”;它放在棧里

如果一個字符串 用創建對象的方式 String s = new String(“abc”);

那它是放在了 堆里 而如果單純的 一個 “abc” 這個輸入字符串常量 是放在static segement里

java常量池不在堆中也不在棧中,是獨立的內存空間管理。

 1. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)

 2. 堆:存放所有new出來的對象。

 3. 常量池:存放字符串常量和基本類型常量(public static final)。

對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。

不是,樓上回答的已經很完善了,棧裡面存放基本類型的變量數據和對象的引用,比如int i=1;這是放在棧裡面的;String s=new String(“123”);這個裡面,s是放在棧裡面的,而new出來的String類型對象是放在堆里的。

區分放在地方是看類型決定不是作用域決定的哈

不明白可以追問

Java中所有局部變量和對象的引用都是存儲在棧內存中的,int a = 1;它是局部變量肯定是在棧內存,但是它與常量池沒有關係;

常量池是堆內存中的一部分,專門用來存儲字符串常量;所以String a=”abc”中,引用a是存儲在棧內存的,指向常量池中的”abc”;

但是如果是String a = new String(“abc”);就又不一樣了,對於通過構造函數得到的”abc”字符串對象,引用a還是在棧內存,但是”abc”不會存到字符串常量池中,而是在常量池之外的其他堆內存中再生成一個”abc”,由於這個對象與原先常量池中的”abc”對象是equal關係,它們之間會建立起一種聯繫;

java常量池不在堆中也不在棧中,是獨立的內存空間管理。

1. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)

2. 堆:存放所有new出來的對象。

3. 常量池:存放字符串常量和基本類型常量(public static final)。

對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126903.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論