`
guhanjie
  • 浏览: 300517 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java世界中探寻sizeof

    博客分类:
  • Java
 
阅读更多
http://bbs.itheima.com/thread-17336-1-1.html 写道
在以前学习C或C++的时候,有一个函数sizeof可以求的一个数据项分配的字节数,为什么在java里面没有提供这样的函数?
那么我们如何知道一个数据分配项占用了多少个字节呢?难道每次不确定的时候都要翻文档查询吗?

 

http://bbs.itheima.com/thread-17336-1-1.html 写道
C中要使用sizeof主要是因为C程序员要自己管理堆内存的分配和释放,在使用malloc来获取堆内存时,我们必须知道要创建的对象的具体大小,才能根据对象的具体大小从堆中分配相应大小的动态内存,而获取对象大小这个工作就是通过sizeof来完成的。而java中的内存管理任务直接交给了JVM。因此,java中不存在类似sizeof的操作符。
如果楼主真的想实现sizeof功能,可以使用新提供的Instrument包。通过这个包提供的接口和类,我们可以很容易获取一个对象实际占用的内存大小。不过这个得jdk5.0以上。

java里面基本数据类型所占有的字节数都是一样的哈,与机器无关。
java中没有这样的功能计算占用字节数的,字节数都是固定的,查下表
byte b; 1字节 short s; 2字节
int i; 4字节 long l; 8字节
char c; 2字节(C语言中是1字节)
float f; 4字节 double d; 8字节
boolean bool; false/true

 

http://ar.newsmth.net/thread-5d4be64f02578b.html 写道
发信人: ThunderW (霹雳游侠), 信区: Java
标 题: Sizeof For Java(tm)
发信站: BBS 水木清华站 (Thu May 29 15:25:23 2003), 转信

http://www.glenmccl.com/tip_038.htm
今天没事看精华区,发现去年有人讨论java的sizeof。结论好想是没什么好办法。
上面的地址先讨论了一下java中没有sizeof的必要,然后给了一段实现sizeof的代码。

In previous issues we've mentioned that Java(tm) has no sizeof() operator
like C/C++. With uniform sizes for primitive data types, and a different
style of memory allocation, the need for sizeof() really isn't there. And
it's hard to define what sizeof() would mean anyway, given that an object
may not contain other objects, but only references to them.


But it's interesting to experiment with the 1.1 reflection feature and see
whether a method can be devised that will return useful information about
object sizes.


The Sizeof class below tries to do this, for a passed-in data structure.
It walks the structure and tallies up the total size in bytes. It ignores
alignment and packing issues and hidden fields in structures, and assumes
a boolean is of size 1 and a reference of size 4 (reference sizes may vary
; for example SZ_REF might be 8 on a machine with 64-bit pointers).


It does not count static data members of class instances, but does include
members inherited/implemented from superclasses and interfaces. It does
not follow references in object instances or in arrays, except for the case
of a multi-dimensional array, where the reference is to another array.


Included are some tests that illustrate what results are expected in given
cases.


import java.lang.reflect.*; 

class test_Class1 { 
private int a1; 
public byte a2; 
protected char a3[]; 
static byte a33; 
} 

class test_Class2 extends test_Class1 { 
static float a33; 
byte a3; 
short a4; 
double a5[] = new double[10]; 
} 

class test_Class3 extends test_Class2 { 
boolean a4; 
static int a44; 
char a5; 
long a6; 
} 

interface test_Class4 { 
public byte x = 1; 
} 

interface test_Class5 extends test_Class4 { 
public int x = 2; 
} 

class test_Class6 { 
public double x; 
} 

class test_Class7 extends test_Class6 implements test_Class5 { 
char x[] = null; 
} 

public class Sizeof { 

private static final int SZ_REF = 4; 

public static int sizeof(boolean b) 
{ 
return 1; 
} 

public static int sizeof(byte b) 
{ 
return 1; 
} 

public static int sizeof(char c) 
{ 
return 2; 
} 

public static int sizeof(short s) 
{ 
return 2; 
} 

public static int sizeof(int i) 
{ 
return 4; 
} 

public static int sizeof(long l) 
{ 
return 8; 
} 

public static int sizeof(float f) 
{ 
return 4; 
} 

public static int sizeof(double d) 
{ 
return 8; 
} 

private static int size_inst(Class c) 
{ 
Field flds[] = c.getDeclaredFields(); 
int sz = 0; 

for (int i = 0; i < flds.length; i++) { 
Field f = flds[i]; 
if (!c.isInterface() && 
(f.getModifiers() & Modifier.STATIC) != 0) 
continue; 
sz += size_prim(f.getType()); 
} 

if (c.getSuperclass() != null) 
sz += size_inst(c.getSuperclass()); 

Class cv[] = c.getInterfaces(); 
for (int i = 0; i < cv.length; i++) 
sz += size_inst(cv[i]); 

return sz; 
} 

private static int size_prim(Class t) 
{ 
if (t == Boolean.TYPE) 
return 1; 
else if (t == Byte.TYPE) 
return 1; 
else if (t == Character.TYPE) 
return 2; 
else if (t == Short.TYPE) 
return 2; 
else if (t == Integer.TYPE) 
return 4; 
else if (t == Long.TYPE) 
return 8; 
else if (t == Float.TYPE) 
return 4; 
else if (t == Double.TYPE) 
return 8; 
else if (t == Void.TYPE) 
return 0; 
else 
return SZ_REF; 
} 

private static int size_arr(Object obj, Class c) 
{ 
Class ct = c.getComponentType(); 
int len = Array.getLength(obj); 

if (ct.isPrimitive()) { 
return len * size_prim(ct); 
} 
else { 
int sz = 0; 
for (int i = 0; i < len; i++) { 
sz += SZ_REF; 
Object obj2 = Array.get(obj, i); 
if (obj2 == null) 
continue; 
Class c2 = obj2.getClass(); 
if (!c2.isArray()) 
continue; 
sz += size_arr(obj2, c2); 
} 
return sz; 
} 
} 

public static int sizeof(Object obj) 
{ 
if (obj == null) 
return 0; 

Class c = obj.getClass(); 

if (c.isArray()) 
return size_arr(obj, c); 
else 
return size_inst(c); 
} 

private static void err(String s) 
{ 
System.err.println("*** " + s + " ***"); 
} 

private static void test() 
{ 
if (sizeof(null) != 0) 
err("null"); 

if (sizeof(true) != 1) 
err("boolean"); 
if (sizeof((byte)37) != 1) 
err("byte"); 
if (sizeof('x') != 2) 
err("char"); 
if (sizeof((short)37) != 2) 
err("short"); 
if (sizeof(37) != 4) 
err("int"); 
if (sizeof(37L) != 8) 
err("long"); 
if (sizeof(37.0f) != 4) 
err("float"); 
if (sizeof(37.0) != 8) 
err("double"); 

if (sizeof(new boolean[0]) != 0) 
err("boolean[0]"); 
if (sizeof(new byte[10]) != 10) 
err("byte[10]"); 
if (sizeof(new char[10][10]) != 200 + 10 * SZ_REF) 
err("char[10][10]"); 
if (sizeof(new short[10][11][12]) != 2640 + 
120 * SZ_REF) 
err("short[10][11][12]"); 
if (sizeof(new int[0][10]) != 0) 
err("int[0][10]"); 

if (sizeof(new String[100]) != 100 * SZ_REF) 
err("String[100]"); 
if (sizeof(new String[10][10]) != 110 * SZ_REF) 
err("String[10][10]"); 

Object ov[] = new Object[3]; 
ov[0] = new byte[10]; 
ov[2] = new double[10]; 
if (sizeof(ov) != 90 + 3 * SZ_REF) 
err("Object[3]"); 

String sv[] = new String[10]; 
for (int i = 0; i < 10; i++) 
sv[i] = new String(); 
if (sizeof(sv) != 10 * SZ_REF) 
err("String[10]"); 

if (sizeof(new Object()) != 0) 
err("Object"); 
if (sizeof(new Integer(37)) != 4) 
err("Integer(37)"); 

if (sizeof(new test_Class1()) != 5 + SZ_REF) 
err("test_Class1"); 
if (sizeof(new test_Class2()) != 8 + 2 * SZ_REF) 
err("test_Class2"); 
if (sizeof(new test_Class3()) != 19 + 2 * SZ_REF) 
err("test_Class3"); 

if (sizeof(new test_Class7()) != 13 + SZ_REF) 
err("test_Class7"); 
} 

public static void main(String args[]) 
{ 
test(); 
} 

} 
 

-----
完。
--

 

分享到:
评论

相关推荐

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

    本文将深入探讨Java中的对象内存占用,以及如何使用"java-sizeof-0.0.4"工具来查看Java对象在内存中的大小。 在Java中,内存主要分为堆内存(Heap)和栈内存(Stack)。对象通常存储在堆内存中,而基本类型的变量和...

    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`通常是指用来计算对象在内存中占用空间的一种方法。本篇文章将探讨如何通过Java来实现这样的功能,以及相关知识点。...

    Java之基本数据类型 Sizeof 大小

    `Sizeof` 在Java中并不存在,与C++等语言不同,Java没有提供直接计算对象或变量在内存中占用字节数的内置方法。然而,我们可以探讨Java的基本数据类型及其内存占用。 1. **整型数据类型**: - `byte`: 占用1个字节...

    java sizeof

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

    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 对象的大小

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

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

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

    解析C语言中的sizeof.rar

    在C语言中,`sizeof`是一个非常重要的运算符,它用于获取任何数据类型或变量所占用的内存字节数。这个运算符对于理解和优化代码、处理内存分配以及了解底层计算机工作原理都至关重要。下面我们将详细探讨`sizeof`的...

    详细解析C语言中的sizeof

    ### 详细解析C语言中的`sizeof` #### 一、`sizeof`的概念 `sizeof`是C语言中的一个单目操作符,类似于其他操作符如`++`和`--`等。需要注意的是,`sizeof`不是函数,而是用来获取操作数(可以是一个表达式或类型名...

    matlab开发-sizeof

    在MATLAB编程环境中,`sizeof`是一个非常重要的函数,它用于获取MATLAB中内置数据类型所占用的内存字节数。这个知识点对于理解和优化MATLAB程序的性能、内存使用以及理解数据存储方式至关重要。下面我们将深入探讨`...

    解析C语言中的sizeof.docx

    C语言中的sizeof操作符 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的...

    SizeOf.jar

    SizeOf.jar就是用来解决这个问题的,它提供了一种方法来估算Java对象在内存中占用的空间。 SizeOf.jar的工作原理是通过反射API来遍历对象的所有字段,包括嵌套的对象和数组,然后计算每个字段所占的字节数。Java中...

    SizeOf_0_2_2.zip_java

    标题 "SizeOf_0_2_2.zip_java" 指示的是一个针对Java语言的特定工具或库,它的主要功能是帮助开发者计算对象在内存中占用的空间大小。这个工具通常用于性能优化和内存管理,因为理解对象的大小对于有效地使用内存...

    sizeof计算struct大小

    在 C 语言中,sizeof 运算符可以应用于变量、数组、结构体、联合体、枚举类型等各种数据类型。sizeof 运算符的结果是变量或类型的大小,以字节为单位。 在结构体中,sizeof 不是成员类型大小的简单相加。计算结构体...

    MFC源代码 SIZEOF.02

    MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 ...

    详细讲解sizeof的使用

    2. **计算数组中元素的个数**:`sizeof` 还可以用来计算数组中元素的个数,例如 `void* memset(void* s, int c, sizeof(s))`。 #### 六、使用建议 由于操作数的字节数可能会随着实现的不同而变化,建议在涉及操作...

    sizeof 计算出实例的大小

    在Java编程语言中,`sizeof`关键字并不像C++那样直接用于计算对象或类型的大小。Java没有提供内置的`sizeof`操作符,因为它的内存管理是自动的,由垃圾收集器(GC)处理。然而,程序员有时仍需要了解对象占用的内存...

    sizeof函数的编写

    不用C中关键字sizeof 计算int型的字节数 要求编写sizeof函数

    sizeof用法

    sizeof用法详解 sizeof是C语言中一种单目操作符,用于...sizeof 操作符是 C 语言中一个非常有用的操作符,它可以用来获取各种类型的存储大小。但是需要注意的是,sizeof 操作符不能用于函数类型、不完全类型或位字段。

Global site tag (gtag.js) - Google Analytics