在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 于 2006-09-25 00:53
分享到:
相关推荐
赠送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中的对象内存占用,以及如何使用"java-sizeof-0.0.4"工具来查看Java对象在内存中的大小。 在Java中,内存主要分为堆内存(Heap)和栈内存(Stack)。对象通常存储在堆内存中,而基本类型的变量和...
在Java编程语言中,了解一个对象的内存大小是很有用的,特别是在性能调优和内存管理方面。`sizeOf`通常是指用来计算对象在内存中占用空间的一种方法。本篇文章将探讨如何通过Java来实现这样的功能,以及相关知识点。...
赠送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工具。非常好用。 下载后,导入这个jar包。然后在run as中配置VM参数如下: -javaagent:C:\\***存放路径***\\SizeOf.jar(DEF**盘都可以的哈)
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...
`Sizeof` 在Java中并不存在,与C++等语言不同,Java没有提供直接计算对象或变量在内存中占用字节数的内置方法。然而,我们可以探讨Java的基本数据类型及其内存占用。 1. **整型数据类型**: - `byte`: 占用1个字节...
NULL 博文链接:https://spice.iteye.com/blog/1104340
这是 Scala/Java 的内存消耗估算器。... <artifactId>java-sizeof_2.11 <version>0.1 用法 对于任何对象,通过调用估计对象大小 SizeEstimator.estimate(obj); 有关更多示例,请查看示例文件夹。
SizeOf.jar就是用来解决这个问题的,它提供了一种方法来估算Java对象在内存中占用的空间。 SizeOf.jar的工作原理是通过反射API来遍历对象的所有字段,包括嵌套的对象和数组,然后计算每个字段所占的字节数。Java中...
标题 "SizeOf_0_2_2.zip_java" 指示的是一个针对Java语言的特定工具或库,它的主要功能是帮助开发者计算对象在内存中占用的空间大小。这个工具通常用于性能优化和内存管理,因为理解对象的大小对于有效地使用内存...
用于测量 Java 对象内存大小的 Java 库。 import com.arturmkrtchyan.sizeof4j.util.ConsoleUtil ; import static java.lang.System.out ; class Main { public static void main ( String [] args ) { ...
在Java编程语言中,`sizeof`关键字并不像C++那样直接用于计算对象或类型的大小。Java没有提供内置的`sizeof`操作符,因为它的内存管理是自动的,由垃圾收集器(GC)处理。然而,程序员有时仍需要了解对象占用的内存...
首先,你需要从官方网站下载SizeOf.jar文件并将其解压到一个合适的目录中。例如,本例中的解压路径为: ``` E:\apache-maven-3.0.3\.m2\repository\net\sourceforge\sizeof\0.2\SizeOf.jar ``` ### 步骤2:配置...
知识点:Java 语言中的关键字,abstract 用于定义抽象类,sizeof 是 C 语言中的关键字,不是 Java 中的关键字,NULL 是 Java 中的空对象引用,Native 是 Java 中的 native 方法关键字。 2. 创建 Apple 线程的正确...
+ 和 += 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-...
原项目下载地址:http://sourceforge.net/projects/sizeof/ ...1、将SizeOf.jar放到Eclipse工程路径下,添加到classpath中; 2、运行前添加VM参数:-javaagent:lib/SizeOf.jar 运行即可(将jar放在lib路径下)。
Java 语言没有 sizeof,因为 Java 认为 C 语言中的 sizeof 主要用于跨平台,而 Java 本身就是跨平台的。Java 中没有 unsigned,也就是说 Java 中的基本数据类型都是有符号的。 Java 关键字和运算符 Java 中有多种...
9. **Java保留字**:`sizeof`不是Java的保留字,Java中没有类似C/C++的`sizeof`运算符。 10. **GridLayout容器**:`GridLayout`布局管理器可以将组件按网格布局,所有单元格大小相同。若要在特定区域放置多个组件,...
Java 程序员笔试题 本资源提供了 Java 程序员笔试题,共 10 道单项选择题和 2 道多项选择题,涵盖了 Java ...2. 不是 Java 关键字的选项包括 TRUE、sizeof、goto 等。 知识点:Java 关键字、保留字、编程语言基础。