16位機器,c++,sizeof(int)=2byte長度
32位機器,c++,sizeof(int)=4byte長度
在C/C++中,當我們想知道一個對象或者一個原始數據類型所占用的內存大小時,只需簡單調用
sizeof操作符即可,但是,在
java中是沒有相應的操作符或者方法來直接完成相應功能的。
sizeof 在C/C++得到大量的運用,是程序員必不可少的工具之一,那么為什么
java卻不提供呢?要回答這個問題,我們可以從另外一個角度來看,那就是為什么C/C++中要使用
sizeof。C中要使用
sizeof主要是因為C程序員要自己管理堆內存的分配和釋放,在使用malloc來獲取堆內存時,我們必須知道要創建的對象的具體大小,才能根據對象的具體大小從堆中分配相應大小的動態內存,而獲取對象大小這個工作就是通過
sizeof來完成的。到了C++,我們可以使用操作符new來動態分配內存,這時,對于
sizeof的依賴也沒有在C時代時那么嚴重了。在C++中保留
sizeof,主要是為了跟C保持兼容。說到這里,我們也可以明白為什么
java中為什么沒有
sizeof了:
java中的內存管理任務直接交給了JVM,這比C++更為徹底。同時,
java是一個全新設計的完全面向對象語言,不存在C++向下兼容的問題,因此,
java中不存在類似
sizeof的操作符。(存在即合理,不存在也有它的道理:))。
但是,有些時候事情并不沒有想象中那么簡單。當我們用
Java編寫應用程序時,雖然很多時候我們都不需要了解內存的使用情況,因為JVM已經幫我們照顧好這些珍貴的資源,但是,某些時候,譬如我們要編寫一個性能監測工具或者在調試時我們需要知道某個對象所占用的內存大小的。怎么辦呢?是不是很懷念我們的
sizeof呢。
不用擔心,所謂天無絕人之路。如果我們使用的JDK的版本是5.0或以上,那么,我們可以使用新提供的Instrument包。通過這個包提供的接口和類,我們可以很容易獲取一個對象實際占用的內存大小。Instrument的具體描述可以參看JDK文檔,【1】提供了一個很好的例子。
但是,上述方法只能獲取對象的占用內存的大小,對于int ,long等原始類型是沒有辦法得知其內存大小的。有的人可能會問,這些原始類型在
java的specification中定義好的嗎?我們都知道,int用4個字節,long占用8個字節。對,
java規范是對原是類型的大小作出了定義,但是這僅僅是對該類型邏輯上所需的字節作出了規定,具體到每個JVM實現中用到的實際內存大小是沒有限制的,我們完全可以實現一個JVM使用8個字節來保存一個int(不知道現在64位CPU機子上是不是使用8個字節(64位)來保存一個int,我這里沒有機器可以進行試驗)。因此,要知道一個原始類型到底占用多少內存,我們還需另外想辦法。【2】【3】【4】【5】提供了相關的信息,有興趣的朋友可以參考一下。這里,貼出各個基本類型所占用內存的實際大小,看跟你想象中是否一致。(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
|