在Java中是否有任何sizeof类似的方法?
Java中有没有内置的方法来查找任何数据types的大小? 有什么方法可以find大小?
不。在标准的Java SE类库中没有这样的方法。
devise者的观点是,在Java中这是不需要的,因为语言不需要应用程序1来知道需要为原始值,具有给定元素数目的对象或数组保留多less空间。
您可能会认为sizeof运算符对于需要知道数据结构占用多less空间的人员会很有用。 但是,您也可以使用Java内存分析器简单可靠地获取此信息以及更多信息,因此不需要sizeof方法。
@Davor指出sizeof(someInt)
比4
更可读。 我不确定我是否同意…因为我认为每个Java程序员都应该知道int
总是 32位(4个字节)。 (另外,在Java代码中使用一个types的大小是很less必要的)
但是,如果你接受可读性论证,那么补救办法就在你的手中。 简单地定义一个这样的类…
public class PrimitiveSizes { public static int sizeof(byte b) { return 1; } public static int sizeof(short s) { return 2; } // etcetera }
…并静态导入…
import static PrimitiveSizes.*;
为什么Javadevise者没有在标准库中实现呢? 我的猜测是:
- 他们不认为有这个需要,
- 他们不认为有足够的需求,
- 他们不认为这是值得的努力。
上面的关键词是他们 。 (无论你如何看待这件事,除非你在决策过程中有一定的影响力。)
还有一个问题,就是下一个需求是对于技术上困难重重的sizeof(Object o)
方法。
1 – 程序员可能需要知道为了devise节省空间的数据结构。 但是,我无法想象为什么通过方法调用在运行时应用程序代码中需要这些信息。
来自JavaWorld的文章
一个肤浅的答案是,Java不提供像C的sizeof()。 但是,让我们考虑一下,为什么Java程序员可能偶尔需要它。
AC程序员自己pipe理大多数数据结构内存分配,sizeof()对于了解分配的内存块大小是必不可less的。 此外,像malloc()这样的C内存分配器几乎不涉及对象初始化:程序员必须设置所有对象字段,这些对象字段是指向其他对象的指针。 但是,当所有的说法和编码,C / C ++内存分配是相当有效的。
相比之下,Java对象的分配和构造是捆绑在一起的(不可能使用已分配但未初始化的对象实例)。 如果Java类定义了对其他对象的引用的字段,那么在构build时设置它们也是很常见的。 因此,分配一个Java对象经常分配许多互连的对象实例:一个对象图。 再加上自动垃圾收集,这太方便了,可以让你觉得你不必担心Java内存分配的细节。
当然,这只适用于简单的Java应用程序。 与C / C ++相比,等效的Java数据结构倾向于占用更多的物理内存。 在企业软件开发中,接近当今32位JVM上的最大可用虚拟内存是一种常见的可伸缩性限制。 因此,一个Java程序员可以从sizeof()或类似的东西中受益,从而关注他的数据结构是否变得太大或者包含内存瓶颈。 幸运的是,Javareflection允许你很容易地编写这样一个工具。
在继续之前,我将免去一些频繁但不正确的回答这篇文章的问题。 谬论:Sizeof()不需要,因为Java基本types的大小是固定的
是的,所有JVM和所有平台上的Java int都是32位,但这只是程序员可以感知的数据types宽度的语言规范要求。 这样的int本质上是一个抽象的数据types,可以通过64位机器上的64位物理内存字来备份。 对于非原始types也是如此:Java语言规范没有说明如何在物理内存中alignment类字段,也没有说明在JVM内部无法实现布尔数组作为紧凑的位向量。 谬误:您可以通过将其序列化为字节stream并查看生成的stream长度来测量对象的大小
这不起作用的原因是因为序列化布局只是真正的内存中布局的远程反映。 一个简单的方法就是查看string是如何被序列化的:在内存中,每个字符至less有2个字节,但是以string的forms,string是UTF-8编码的,所以任何ASCII内容都占用一半的空间
Java本地访问库通常用于从Java调用本地共享库。 在这个库中有确定Java对象大小的方法:
getNativeSize(Class cls)
方法及其重载将为大多数类提供大小。
另外,如果你的类inheritance自JNA的Structure类, calculateSize(boolean force)
方法将可用。
你可以像下面那样进行位操作来获得原语的大小:
public int sizeofInt() { int i = 1, j = 0; while (i != 0) { i = (i<<1); j++; } return j; } public int sizeofChar() { char i = 1, j = 0; while (i != 0) { i = (char) (i<<1); j++; } return j; }
如上所述,有可能通过包装来获取原始types的大小。
例如long
这可能是从Java 1.5的Long.SIZE / Byte.SIZE
(如已经提到的zeodtr )或Long.BYTES
从Java 8
对于来自Java 1.5的基本types,可以使用Integer.SIZE / 8,Double.SIZE / 8等。
Instrumentation类有一个getObjectSize()方法,但是,您不应该在运行时使用它。 检查内存使用情况的最简单方法是使用一个旨在帮助您跟踪内存使用情况的分析器。
我决定创build一个枚举,而不遵循标准的Java约定。 也许你喜欢这个。
public enum sizeof { ; public static final int FLOAT = Float.SIZE / 8; public static final int INTEGER = Integer.SIZE / 8; public static final int DOUBLE = Double.SIZE / 8; }
最简洁的答案是不。 长的答案在这里: http : //www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html
不。您可以在这里find一个很好的解释:
- http://www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html
- http://www.javaworld.com/javaworld/javatips/jw-javatip130.html
🙂
我不认为这是在Java API。 但是大多数数据types都有一个size()
方法。 我想你可以很容易地写一个函数来检查自己的大小?
EhCache提供了一个SizeOf类,它将尝试使用Instrumentation代理,如果代理未加载或无法加载( 详细信息,请参阅此处 ),将回退到不同的方法。
也见Heinz Kabutz的代理人 。
SourceForge.net上有一个类/ jar,它使用Java工具来计算任何对象的大小。 这是一个描述的链接: java.sizeOf