日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java中对象的储存区

發(fā)布時間:2025/6/17 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中对象的储存区 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1 兩個重要的問題
    • 2 C語言中數(shù)據(jù)的存儲區(qū)
    • 3 Java中對象的儲存區(qū)
    • 4 Java為什么采用動態(tài)內(nèi)存分配?
    • 4 為什么基本類型是特例?

1 兩個重要的問題

  • 對象的數(shù)據(jù)位于何處?

  • 如何控制對象的生命周期?


  • 2 C語言中數(shù)據(jù)的存儲區(qū)

  • 棧內(nèi)存(Stack):主要是用來存儲函數(shù)調(diào)用(function calls)局部變量(local variables) 的內(nèi)存區(qū),它在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)本質(zhì)就是一個棧(Stack)。需要注意的是,如果棧內(nèi)存使用過多,就會出現(xiàn)所謂的堆棧溢位(Stack overflow),如死遞歸。

  • 堆內(nèi)存(Heap):主要是用來存儲由 malloc() 申請的內(nèi)存。如果 malloc() 返回**NULL**的話就表明內(nèi)存用完。

  • 靜態(tài)內(nèi)存(Static):它的生命周期與程序相同,即在進(jìn)程創(chuàng)建是被創(chuàng)建,在程序退出時被銷毀。全局作用域變量(global variables), 文件作用域變量(file scope variables)和被 static 修飾的變量會儲存在這里。

  • 寄存器(Register):這個關(guān)鍵字的作用是請求編譯器盡可能的將變量存在CPU內(nèi)部寄存器中,而不是通過內(nèi)存尋址訪問,以提高效率。需要注意的是:register這個關(guān)鍵字只是一個請求,請求CPU給你一個內(nèi)存,給不給還在于CPU。


  • 3 Java中對象的儲存區(qū)

  • :通過堆棧指針來操縱內(nèi)存,指針下移則分配內(nèi)存,指針上移則釋放內(nèi)存, 如圖(圖片來源于網(wǎng)絡(luò))

    在程序創(chuàng)建的時候,必須知道儲存在堆棧內(nèi)所有的數(shù)據(jù)項(xiàng),以便可以操縱指針,這樣的約束就限制了Java的靈活性,所以部分?jǐn)?shù)據(jù)存儲在此,特別是對象的引用,而對象本身不儲存并在其中

  • :用于存放所有的Java對象,不同于棧,它不需要知道數(shù)據(jù)在堆中的生存期,需要的時候便 new 一個對象出來,那么如何釋放掉內(nèi)存呢?不得不提的是Java中的垃圾回收機(jī)制了,不像C/C++需要手動釋放內(nèi)存,垃圾回收機(jī)制會自動地檢測并釋放無用的內(nèi)存,避免了程序的內(nèi)存泄漏問題。

  • 常量儲存:常量值一般直接存放在程序代碼的內(nèi)部,這樣做是很安全的,因?yàn)槭浅A恐?#xff0c;所以他們不希望被改變,也不會被改變。

  • 寄存器:(編程人員不能控制,也感知不到,不做討論)

  • 非RAM儲存:儲存在磁盤上的對象。


  • 4 Java為什么采用動態(tài)內(nèi)存分配?

    C/C++認(rèn)為效率的控制是很重要的,那么在設(shè)計者在實(shí)現(xiàn)的時候給予了編程人員選擇的權(quán)力,為了追求更快的速度和更高的效率,對象的存儲空間和生命周期在編寫程序的時候就確定,這種方式將存儲空間的分配和釋放放置于優(yōu)先考慮的位置,但是某些情況這種方式也犧牲了靈活性,于是就有第二種方式。

    第二種存儲方式就是在堆內(nèi)存中動態(tài)的創(chuàng)建,這種方式中,直到運(yùn)行程序的時候才知道需要多少對象,才知道它們的生命周期及其屬性,在需要的時候也可以在此時刻創(chuàng)建,即儲存空間是動態(tài)管理的,但是這種方式需要花費(fèi)大量的時間在堆中分配存儲空間即釋放內(nèi)存空間,這可能要遠(yuǎn)遠(yuǎn)大于在堆棧中創(chuàng)建儲存空間的時間,在堆棧中創(chuàng)建儲存空間和釋放儲存空間各需要一條匯編指令即可。

    所以Java設(shè)計者認(rèn)為動態(tài)操作的方式雖然速度效率不及前者,但是在復(fù)雜的程序設(shè)計中,這種靈活方式反而提升了速度和效率,所以Java完全采用了動態(tài)內(nèi)存分配方式(基本類型是特例)。


    4 為什么基本類型是特例?

    Java中的基本類型:
    boolean、byte、char、short、int、long、float、double、(void)

    boolean b = false; int i = 0; double d = 9.26;

    如果基本類型往往是特別小而簡單的變量,如果 new 一個對象出來,并不具有效率。

    所以和C/C++一樣,Java對待基本變量,把它儲存在堆棧中,更具有效率。

    為了讓基本類型具有變量的特性,Java中也有相應(yīng)的包裹類型,來應(yīng)對不同的需求:

    基本類型包裹類型
    booleanBoolean
    byteByte
    charCharacter
    shortShort
    intInteger
    longLong
    floatFloat
    doubleDouble
    voidVoid

    參考:
    《Thinking in Java》 - Bruce Eckel

    總結(jié)

    以上是生活随笔為你收集整理的Java中对象的储存区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。