1. 程式人生 > >Java物件在記憶體中是如何儲存的

Java物件在記憶體中是如何儲存的

在Java中,所有的物件都被動態地分配在堆上。這與C++不同,C++的物件要麼分配在棧中,要麼分配在堆上。在C++中,我們用new()來分配物件,這個物件就會被分配到堆上,如果不是全域性的或者靜態的,那麼就會分配到棧上。

在Java中,只有我們在申明一個型別變數的時候,只建立一個引用(記憶體不會為物件分配)。為了給一個物件分配記憶體,我們必須用new()。所以物件總是分配在堆上(詳細情況請看這裡)。

例如,下面的程式不能編譯,編譯器報“Error here because t is not initialed”的錯誤。

class Test {
    // class contents
    void
show() { System.out.println("Test::show() called"); } } public class Main { public static void main(String[] args) { Test t; t.show(); // Error here because t is not initialed } }

用new()分配記憶體可以讓上面的程式碼執行。

class Test {
    // class contents
    void show() {
        System.out.println("Test::show() called"
); } } public class Main { public static void main(String[] args) { Test t = new Test(); //all objects are dynamically allocated t.show(); // No error } }

相關推薦

jvm 物件記憶體儲存的佈局

jvm  物件在記憶體中儲存的佈局有三部分:物件頭、例項資料、對齊填充。 1、物件頭:執行時資料、型別指標、陣列長度。 (1)執行時資料:hashcode雜湊碼、鎖狀態標誌、執行緒持有的鎖、GC年齡分代等,有些不是固定不變的,在執行時會根據當時的狀態進行修改。 (2)型別指標:

java物件記憶體佈局的基本型別欄位排列順序

java物件記憶體佈局: mark word class物件指標 類欄位 補齊位 如果是陣列物件,2、3之間應該加上  陣列長度 佈局排列表: 32位jdk 普通物件 32位jdk 陣列物件

牛客網——華為機試(題15:求int型正整數在記憶體儲存時1的個數)(Java

題目描述: 輸入一個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。 輸入描述: 輸入一個整數(int型別) 輸出描述:  這個數轉換成2進位制後,輸出1的個數 示例1: 輸入: 5 輸出: 2 程式碼:  import java.ut

java的各種資料型別在記憶體儲存的方式

1.java是如何管理記憶體的 java的記憶體管理就是物件的分配和釋放問題。(其中包括兩部分) 分配:記憶體的分配是由程式完成的,程式設計師需要通過關鍵字new為每個物件申請記憶體空間(基本型別除外),所有的物件都在堆(Heap)中分配空間。 釋放:物件的釋放是由

Java物件記憶體儲存,引用傳遞,值傳遞詳細圖解

問題: Java在呼叫函式時,物件作為引數傳遞,執行函式後引數物件的值是否發生改變。 正文: 在解決這個問題之前首先得說說Java物件在記憶體中的儲存機制。 我們知道Java資料型別基本分為兩種,一是基本型別,還一種是引用型別。 基本型別: 物件型別

java在redis儲存物件

最近需要封裝一個操作redis的工具類,不知道怎麼向redis中儲存物件,想到過用java反射去做。在網上搜索了一下,發現可以用序列化物件的方式去儲存。再此我整理了一下感謝,殘劍_提供的方法:http://www.cnblogs.com/liuling/p/2014-4-19

整形數int、浮點型資料float,在記憶體儲存的表示

引言: 突然想到一個底層問題。 計算機組成原理裡學的:定點整數 定點小數 浮點數; 程式設計裡的基本資料型別int float在記憶體中的儲存形式; 二者究竟的對應關係是? CSDN部落格裡有這樣一句話,“實數在記憶體中以規範化的浮點數存放”,請先理清“實數”是多大範圍再回味這句話! 我在書上看到

Ehcache計算Java物件記憶體大小

在EHCache中,可以設定maxBytesLocalHeap、maxBytesLocalOffHeap、maxBytesLocalDisk值,以控制Cache佔用的記憶體、磁碟的大小(注:這裡Off Heap是指Element中的值已被序列化,但是還沒寫入磁碟的狀態,貌似只有企業版的EHCache支援這種配

計算Java物件記憶體大小

摘要 本文以如何計算Java物件佔用記憶體大小為切入點,在討論計算Java物件佔用堆記憶體大小的方法的基礎上,詳細討論了Java物件頭格式並結合JDK原始碼對物件頭中的協議欄位做了介紹,涉及記憶體模型、鎖原理、分代GC、OOP-Klass模型等內容。最後推薦JDK自帶的Hotspot De

JAVA物件記憶體表示

      java設計者的意圖是想使程式設計師不要去關心物件的記憶體表示,這樣才能使java更容易使用,但我們瞭解一些儲存的細節和原理會有助於我們設計出更合理的程式碼。例類:*  class A{*      private int x;*      private st

Java物件記憶體佈局

注意:本篇部落格,主要參考自《深入理解Java虛擬機器(第二版)》 1、物件在記憶體中儲存的佈局分為三塊 物件頭 儲存物件自身的執行時資料:Mark Word(在32bit和64bit虛擬機器上長度分別為32bit和64bit),包含如下資訊: 物件hashCode 物件GC分代年齡

java物件記憶體到底佔用多少

一個Java物件到底佔用多大記憶體 Java物件的記憶體佈局:物件頭(Header),例項資料(Instance Data)和對齊填充(Padding) 物件佔用的記憶體大小還受到VM引數是否開啟指標壓縮UseCompressedOops的影響

華為oj 字串個數統計&&數字顛倒&&字串翻轉&&字元逆序&&求int型資料在記憶體儲存時1的個數

同樣只上程式,都是簡單題 #include<iostream> using namespace std; int main() { int in[128], count = 0; char n,temp[100]; memset(in, 0, sizeo

Java物件vo屬性為null的轉為""

背景:之所以寫這個方法,是因為在用ireport進行列印的時候,如果你查詢的結果,實體中的屬性為null,那麼列印預覽的時候會顯示一個null,按照要求null是不應該顯示,只需要顯示空白就可以。寫的這個方法就解決了列印時查詢的結果中有的實體的屬性值為null的

求int型資料在記憶體儲存時1的個數

題目描述輸入一個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。輸入描述: 輸入一個整數(int型別)輸出描述: 這個數轉換成2進位制後,輸出1的個數示例1輸入5 輸出2import j

字串記憶體儲存位置

原文連結:http://blog.csdn.net/yangdelong/article/details/5447362?reload ---------------------------------------------------------------------

java 在MySQL儲存檔案,讀取檔案(包括圖片,word文件,excel表格,ppt,zip檔案等)

在設計到資料庫的開發中,難免要將圖片或文件檔案(如word)插入到資料庫中的情況。一般來說,我們可以通過插入檔案相應的儲存路徑,而不是檔案本身,來避免直接向資料庫裡插入的麻煩。但有些時候,直接向MySQL中插入檔案,更加安全,而且更加容易管理。 首先,先要在資料庫中

java讀取記憶體的csv檔案,跳過第一行

package ApacheCommonCSV; import junit.framework.TestCase; import org.apache.commons.csv.CSVFormat; im

C語言——printf列印字串(關於資料在記憶體儲存格式的體現)

PS:本篇文章,是筆者在C語言學習過程中的所產生疑惑的地方,經過查閱相關資料得出的結論,如有錯誤的地方,還望指出改正。 int 佔4個位元組, 這裡輸入的8位16進位制數每相鄰兩位數代表一個位元組。如:44,43,42,41 int b = 0x414

JAVA物件記憶體逃逸技術

“棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本型別的變數(,int, short, long, byt