常用鏈接

          統(tǒng)計

          最新評論

          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

          主站蜘蛛池模板: 安塞县| 阳谷县| 塘沽区| 秦皇岛市| 吉水县| 通城县| 湄潭县| 竹山县| 鞍山市| 双鸭山市| 武义县| 观塘区| 志丹县| 福州市| 时尚| 旌德县| 永川市| 同仁县| 山东| 清丰县| 宁陕县| 杂多县| 凤城市| 阜南县| 湘阴县| 正安县| 灵山县| 武山县| 尖扎县| 麻阳| 兰坪| 泽普县| 榕江县| 揭东县| 绥宁县| 东台市| 叶城县| 柳江县| 乐亭县| 会理县| 鄂伦春自治旗|