`

java中的sizeof

    博客分类:
  • java
阅读更多
转自:
http://dustin.iteye.com/blog/42823

在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


reference:
【1】Playing with the Tiger: Measuring the size of your objects
【2】Sizeof for Java
【3】Java Tip 130: Do you know your data size?
【4】sizeof for java(tm)
【5】http://martin.nobilitas.com/java/sizeof.html
分享到:
评论

相关推荐

    java-sizeof-0.0.5-API文档-中文版.zip

    赠送jar包:java-sizeof-0.0.5.jar; 赠送原API文档:java-sizeof-0.0.5-javadoc.jar; 赠送源代码:java-sizeof-0.0.5-sources.jar; 赠送Maven依赖信息文件:java-sizeof-0.0.5.pom; 包含翻译后的API文档:java-...

    java-sizeof-0.0.5-API文档-中英对照版.zip

    赠送jar包:java-sizeof-0.0.5.jar; 赠送原API文档:java-sizeof-0.0.5-javadoc.jar; 赠送源代码:java-sizeof-0.0.5-sources.jar; 赠送Maven依赖信息文件:java-sizeof-0.0.5.pom; 包含翻译后的API文档:java-...

    java sizeof

    分享一个java中的sizeof工具。非常好用。 下载后,导入这个jar包。然后在run as中配置VM参数如下: -javaagent:C:\\***存放路径***\\SizeOf.jar(DEF**盘都可以的哈)

    java 通过sizeOf计算一个对象的大小

    NULL 博文链接:https://312256159-qq-com.iteye.com/blog/1582196

    java-sizeof-0.0.5.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...

    Java之基本数据类型 Sizeof 大小

    Java之基本数据类型 Sizeof 大小

    java-sizeof-0.0.4:一个查看java对象占用内存大小

    java-sizeof-0.0.4:一个查看java对象占用内存大小

    java SizeOf 对象的大小

    NULL 博文链接:https://spice.iteye.com/blog/1104340

    java-sizeof:ScalaJava 的内存消耗估算器

    这是 Scala/Java 的内存消耗估算器。... <artifactId>java-sizeof_2.11 <version>0.1 用法 对于任何对象,通过调用估计对象大小 SizeEstimator.estimate(obj); 有关更多示例,请查看示例文件夹。

    sizeof4j:Java 的 sizeof

    用于测量 Java 对象内存大小的 Java 库。 import com.arturmkrtchyan.sizeof4j.util.ConsoleUtil ; import static java.lang.System.out ; class Main { public static void main ( String [] args ) { ...

    SizeOf.jar

    一个SizeOf.jar.

    测定JVM中对象占用内存—SizeOf

    原项目下载地址:http://sourceforge.net/projects/sizeof/ ...1、将SizeOf.jar放到Eclipse工程路径下,添加到classpath中; 2、运行前添加VM参数:-javaagent:lib/SizeOf.jar 运行即可(将jar放在lib路径下)。

    sizeof 计算出实例的大小

    sizeof 计算出实例的大小这个类库基本上就是用反射(reflection)来得到类的内部细节,从而计算出其实例的大小。同样,也是用反射来遍历对象图来计算其deep size。

    Thinking in java4(中文高清版)-java的'圣经'

    + 和 += 3.14 使用操作符时常犯的错误 3.15 类型转换操作符 3.15.1 截尾和舍入 3.15.2提升 3.16 Java没有“sizeof” 3.17 操作符小结 3.18 总结 第4章 控制执行流程 4.1 true和false 4.2 if-else 4.3 迭代 4.3.1 do-...

    Thinking in Java简体中文(全)

    3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符总结 3.2 执行控制 3.2.1 真和假 3.2.2 if-else 3.2.3 反复 3.2.4 do-while 3.2.5 for 3.2.6 中断和继续 3.2.7 切换 3.3 总结 3.4 练习 第4章 初始化...

    Thinking in Java 中文第四版+习题答案

    3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符总结 3.2 执行控制 3.2.1 真和假 3.2.3 反复 3.2.6 中断和继续 3.2.7 切换 3.3 总结 3.4 练习 第4章 初始化和清除 4.1 由构建器保证初始化 4.2 方法...

    java联想(中文)

    3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符总结 3.2 执行控制 3.2.1 真和假 3.2.2 if-else 3.2.3 反复 3.2.4 do-while 3.2.5 for 3.2.6 中断和继续 3.2.7 切换 3.3 总结 3.4 练习 第4章 初始化...

    JAVA--达内培训笔记

    java中没有sizeof这个关键字了,java中的boolean类型的值只能用true和false,且这两个也是关键字 enum 枚举 assert 断言 一个标识符尽量符合语义信息,提高程序可读性 类 名 :每个单词首字母大写, 变量和...

    SizeOf_0_2_2.zip_java

    主要用于为java语言提供一个负责中计算空间开销的jar包,可以直接调用包中的方法。

    java基础课件ppt

    java基础课件ppt与上机练习题....所有的数据类型所占用的字节数都是固定的,并且和实现无关,因此在Java中没有sizeof操作符。 不必死记这些关键词,当理解每个关键词的含义后,自然就记住了所有的关键词。

Global site tag (gtag.js) - Google Analytics