java中的sizeof(轉)
16位機器,c++,sizeof(int)=2byte長度32位機器,c++,sizeof(int)=4byte長度
在C/C++中,當我們想知道一個對象或者一個原始數(shù)據(jù)類型所占用的內(nèi)存大小時,只需簡單調(diào)用sizeof操作符即可,但是,在java中是沒有相應的操作符或者方法來直接完成相應功能的。sizeof 在C/C++得到大量的運用,是程序員必不可少的工具之一,那么為什么java卻不提供呢?要回答這個問題,我們可以從另外一個角度來看,那就是為什么C/C++中要使用sizeof。C中要使用sizeof主要是因為C程序員要自己管理堆內(nèi)存的分配和釋放,在使用malloc來獲取堆內(nèi)存時,我們必須知道要創(chuàng)建的對象的具體大小,才能根據(jù)對象的具體大小從堆中分配相應大小的動態(tài)內(nèi)存,而獲取對象大小這個工作就是通過sizeof來完成的。到了C++,我們可以使用操作符new來動態(tài)分配內(nèi)存,這時,對于sizeof的依賴也沒有在C時代時那么嚴重了。在C++中保留sizeof,主要是為了跟C保持兼容。說到這里,我們也可以明白為什么java中為什么沒有sizeof了:java中的內(nèi)存管理任務直接交給了JVM,這比C++更為徹底。同時,java是一個全新設計的完全面向對象語言,不存在C++向下兼容的問題,因此,java中不存在類似sizeof的操作符。(存在即合理,不存在也有它的道理:))。
但是,有些時候事情并不沒有想象中那么簡單。當我們用Java編寫應用程序時,雖然很多時候我們都不需要了解內(nèi)存的使用情況,因為JVM已經(jīng)幫我們照顧好這些珍貴的資源,但是,某些時候,譬如我們要編寫一個性能監(jiān)測工具或者在調(diào)試時我們需要知道某個對象所占用的內(nèi)存大小的。怎么辦呢?是不是很懷念我們的sizeof呢。
不用擔心,所謂天無絕人之路。如果我們使用的JDK的版本是5.0或以上,那么,我們可以使用新提供的Instrument包。通過這個包提供的接口和類,我們可以很容易獲取一個對象實際占用的內(nèi)存大小。Instrument的具體描述可以參看JDK文檔,【1】提供了一個很好的例子。
但是,上述方法只能獲取對象的占用內(nèi)存的大小,對于int ,long等原始類型是沒有辦法得知其內(nèi)存大小的。有的人可能會問,這些原始類型在java的specification中定義好的嗎?我們都知道,int用4個字節(jié),long占用8個字節(jié)。對,java規(guī)范是對原是類型的大小作出了定義,但是這僅僅是對該類型邏輯上所需的字節(jié)作出了規(guī)定,具體到每個JVM實現(xiàn)中用到的實際內(nèi)存大小是沒有限制的,我們完全可以實現(xiàn)一個JVM使用8個字節(jié)來保存一個int(不知道現(xiàn)在64位CPU機子上是不是使用8個字節(jié)(64位)來保存一個int,我這里沒有機器可以進行試驗)。因此,要知道一個原始類型到底占用多少內(nèi)存,我們還需另外想辦法。【2】【3】【4】【5】提供了相關的信息,有興趣的朋友可以參考一下。這里,貼出各個基本類型所占用內(nèi)存的實際大小,看跟你想象中是否一致。(from 【5】Sun JRE 1.4.2 Client Hotspot JVM on Windows)
Type | Size (bytes) |
java.lang.Object | 8 |
java.lang.Float | 16 |
java.lang.Double | 16 |
java.lang.Integer | 16 |
java.lang.Long | 16 |
java.math.BigInteger | 56 (*) |
java.lang.BigDecimal | 72 (*) |
java.lang.String |
2*(Length) + 38 ± 2 |
empty java.util.Vector |
80 |
object reference |
4 |
float array |
4*(Length) + 14 ± 2 |
posted on 2009-06-24 17:02 九寶 閱讀(408) 評論(0) 編輯 收藏 所屬分類: Java