国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java中類似于C語言中Sizeof功能實現(xiàn)(一)

2019-11-18 10:49:34
字體:
供稿:網(wǎng)友

  1.java有類似于C語言中sizeof()的操作器嗎?
  表面答案是Java沒有提供任何類似于C語言的sizeof()的操作器。但是,我們應(yīng)該想想為什么Java 程序員偶然也需要它。
  C語言程序員自己治理大多數(shù)的數(shù)據(jù)結(jié)構(gòu)存儲分配,并且 sizeof()不負(fù)責(zé)了解分配的存儲塊的尺寸大小。C 存儲分配器如malloc(),只要涉及到對象初始化幾乎什么事都不做:程序員必須設(shè)置作為更深一層對象指針的所有對象域。但是當(dāng)所有的都說過并且編碼過的時候, C/C++ 存儲分配是相當(dāng)有效的。
  相比而言,Java對象分配和構(gòu)造緊密結(jié)合(不可能使用一個已經(jīng)分配但是沒有初始化的對象)。假如Java類定義了作為更深一層對象的引用的域,在構(gòu)造階段設(shè)置他們也是很普遍的。Java對象分配器因此頻繁地分配互連對象:對象圖形。與自動垃圾收集耦合,所有這一切都太方便了,并且讓你覺得你根本不必?fù)?dān)心Java存儲分配的細(xì)節(jié)。
  當(dāng)然,這只有對簡單的Java應(yīng)用才有效。相比C/C++而言,同樣的Java數(shù)據(jù)結(jié)構(gòu)往往占據(jù)更多的物理存儲。在企業(yè)軟件開發(fā)中,接近當(dāng)今32位JVM上的最大虛擬存儲是一個普遍的可縮放性限制。因此,Java 程序員可從sizeof() 或者其他類似的函數(shù)中獲益,因為這些函數(shù)能夠觀察它的數(shù)據(jù)結(jié)構(gòu)是否過大或者是否包含存儲瓶頸。幸運的是,Java反射答應(yīng)你相當(dāng)輕易的編寫這種工具。
  接下來,我先討論幾個經(jīng)常出現(xiàn)的對該問題的錯誤理解。
  誤區(qū)1:因為Java類型的大小確定所以不需要 Sizeof()
  不錯,Java int在所有JVM和所有的平臺上都是32位,但是這只是一種語言規(guī)范要求,程序員可以接受的這種數(shù)據(jù)類型的寬度。這種int基本上是一種抽象的數(shù)據(jù)類型,并且可以被 64位設(shè)備上的64位存儲器字所支持。非初級的類型也不例外:Java語言規(guī)范根本沒有涉及這類問題:類域在物理存儲中應(yīng)該如何校準(zhǔn)或者布爾排列在JVM內(nèi)部不能作為一個簡單的位向量來實現(xiàn)。
  誤區(qū)2: 將對象串行成一個位通量然后查看所產(chǎn)生的通量長度就可以測量對象的尺寸大小
  這個方法無效的原因就是串行布局只是真實存儲器內(nèi)布局的遠(yuǎn)程反射。舉例說,通過觀察String是如何串行的:在存儲器內(nèi)每個char至少2個字節(jié),但是在串行的格式中 String是UTF-8編碼的,所以任何ASCII內(nèi)容只占了一半的空間。
  另外一個解決方式
  你可能想起在"Java Tip 130: Do You Know Your Data Size?"一文中描述了一個技巧:在創(chuàng)建大量的標(biāo)記類的基礎(chǔ)上,仔細(xì)的測量在JVM使用的堆棧尺寸中所產(chǎn)生的增長。假如合適的話,這個技巧相當(dāng)有用,實際上我在本文中也用它來引導(dǎo)備用的方法。
  注重:Java 技巧130中的類Sizeof需要一個靜態(tài)的JVM (這樣堆?;顒又荒苡蓽y量線程請求的對象分配和垃圾收集的操作引起),還需要大量的同一對象實例。假如你想測量單一大型對象(可能作為調(diào)試跟蹤輸出的一部分)的尺寸大小,非凡是假如你想測試出實際上是什么使他變得這么大的時候,這個方法就無效了。
  
  2.什么是對象的尺寸?
  上述討論突出了一個哲學(xué)問題:假設(shè)你經(jīng)常處理對象圖形,那么對象尺寸的定義是什么呢?他是指你正在測量的對象實例的尺寸大小還是指根于對象實例的整個數(shù)據(jù)圖形?后者在實際生活中使用的更多一些。如你所見,事情不總是劃分得如此清楚,但是對于啟動程序來說你可以參照以下方法:
  · 一個對象的所有非靜態(tài)數(shù)據(jù)域(包括在超類中定義的域)的總和就是它的尺寸
  · 與C++不同,類方法以及他們的虛擬不影響對象的尺寸
  · 類超接口不影響對象尺寸(見該列表末尾的注釋)
  · 完整的對象尺寸可作為根于啟動對象的整個對象圖形的閉合來獲得
  注釋:實現(xiàn)任何Java接口只對懷疑類做標(biāo)記,而且不添加任何數(shù)據(jù)到它的定義上。實際上, JVM 甚至不校驗接口實現(xiàn)有沒有提供接口所請求的所有方法:在目前的規(guī)范中,這嚴(yán)格說來是編譯器的責(zé)任。
  為了引導(dǎo)整個進(jìn)程,對于初級數(shù)據(jù)類型,我使用Java 技巧130的Sizeof 類來測量物理尺寸。正如它所證實的一樣,對于普通的32位JVM來說,一個簡單的java.lang.Object 占了8位,并且基本數(shù)據(jù)類型通常都是能夠適應(yīng)語言要求的最少的物理尺寸 (除了boolean 要占據(jù)整個字節(jié)之外):
  
  // java.lang.Object shell size in bytes:
  public static final int OBJECT_SHELL_SIZE  = 8;
  
  public static final int OBJREF_SIZE     = 4;
  public static final int LONG_FIELD_SIZE   = 8;
  public static final int INT_FIELD_SIZE   = 4;
  public static final int SHORT_FIELD_SIZE  = 2;
  public static final int CHAR_FIELD_SIZE   = 2;
  public static final int BYTE_FIELD_SIZE   = 1;
  public static final int BOOLEAN_FIELD_SIZE = 1;
  public static final int DOUBLE_FIELD_SIZE  = 8;
  public static final int FLOAT_FIELD_SIZE  = 4;
  
  (這些常量不是永遠(yuǎn)硬編碼的,并且對于一個給定的JVM,它們必須獨立測量,熟悉到這一點很重要)當(dāng)然,幼稚的計算對象域尺寸總和往往忽略了JVM中的存儲隊列問題。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 元氏县| 织金县| 浦北县| 吴忠市| 潮安县| 丰镇市| 玛多县| 镇远县| 乌鲁木齐县| 泸州市| 张家川| 五大连池市| 富源县| 玛沁县| 琼海市| 溧水县| 渭南市| 左贡县| 花垣县| 怀化市| 龙胜| 江孜县| 吉安县| 米泉市| 七台河市| 永胜县| 汉寿县| 溆浦县| 靖江市| 上犹县| 怀集县| 惠安县| 利津县| 钦州市| 藁城市| 上蔡县| 阿荣旗| 方山县| 甘孜县| 体育| 永和县|