1
429
你可以使用 java.lang.instrument package 编译该类并将其放入jar中:
将以下内容添加到
使用GetObjectSize:
调用:
|
2
81
你应该使用 jol 作为OpenJDK项目的一部分开发的工具。
要获取基本体、引用和数组元素的大小,请使用
您可以使用
您可以使用
如果你改为使用
“(其他东西)”条目 describe other objects in the heap that are not part of this object graph . 最好的JOL文档是 jol samples 在Jol存储库中。这些示例演示了常见的jol操作,并展示了如何使用jol分析VM和垃圾收集器内部。 |
3
71
几年前Javaworld an article on determining the size of composite and potentially nested Java objects 它们基本上是通过在爪哇中创建一个siZeFor()实现的。该方法基本上建立在其他实验中,人们在实验中识别原语和典型Java对象的大小,然后将该知识应用于递归地遍历对象图以统计总大小的方法。 它总是比本机C实现更不准确,这仅仅是因为类背后发生了一些事情,但是它应该是一个很好的指示器。 或者,可以适当地调用sourceforge项目 sizeof 它提供了一个带有sizeof()实现的Java5库。 P.S.不要使用序列化方法,序列化对象的大小和它在活动时消耗的内存量之间没有相关性。 |
4
58
首先,“对象的大小”在Java中不是一个定义良好的概念。你可以指的是对象本身,只有它的成员,对象和它所指的所有对象(参考图)。您可以是指内存大小或磁盘大小。并且允许JVM优化字符串之类的东西。 所以唯一正确的方法是使用一个好的探查器(我使用 YourKit ,这可能不是你想要的。 但是,从上面的描述来看,似乎每一行都是独立的,并且没有大的依赖树,因此序列化方法可能是大多数JVM的一个很好的近似方法。最简单的方法如下:
记住,如果有具有公共引用的对象,则 不会 给出正确的结果,序列化的大小并不总是与内存中的大小匹配,但这是一个很好的近似值。如果您将bytearrayOutputstream大小初始化为一个合理的值,那么代码将更加有效。 |
5
52
我偶然发现了一个Java类 “jdk.nashorn.internal.ir.debug.objectsizecalculator”,已经在jdk中, 它很容易使用,而且对于确定一个物体的大小很有用。
结果:
|
6
35
如果您只想知道在您的JVM中使用了多少内存,有多少是空闲的,您可以尝试这样做:
编辑:我认为这可能会有帮助,因为问题的作者还说,他希望有处理“在我使用32MB内存之前,尽可能多地读取行”的逻辑。 |
7
18
当我在Twitter工作的时候,我写了一个计算深对象大小的实用程序。它考虑了不同的内存模型(32位,压缩OOP,64位),填充,子类填充,在循环数据结构和数组上正确工作。你可以编译这个.java文件,它没有外部依赖关系: |
8
13
许多其他答案都提供了较浅的大小——例如,没有任何键或值的哈希图的大小,这不太可能是您想要的。 jamm项目使用上面的java.lang.instrumentation包,但会遍历树,因此可以给您提供深层内存使用。
|
9
10
你必须使用反射来移动物体。像你这样小心:
@Jodonnell:我喜欢您的解决方案的简单性,但是许多对象是不可序列化的(因此这会引发异常),字段可以是临时的,对象可以覆盖标准方法。 |
10
8
您必须使用一个工具来测量它,或者手工估计它,这取决于您使用的JVM。 每个对象都有一些固定的开销。它是特定于JVM的,但我通常估计有40个字节。然后你必须看看班上的成员。对象引用是32位(64位)JVM中的4(8)个字节。基本类型包括:
数组遵循相同的规则;也就是说,它是一个对象引用,因此在对象中需要4(或8)个字节,然后它的长度乘以它的元素的大小。
尝试通过调用
|
11
6
这个
所以我用
|
12
6
还有 内存测量器 工具(以前在 Google Code 现在 GitHub ,简单易懂,以商业友好的方式出版。 Apache 2.0许可证 ,如a中所述 similar question . 如果你想测量内存字节消耗,它也需要命令行参数到Java解释器,但是在我使用它的场景中,它看起来很好。 |
13
3
这里有一个实用程序,我使用一些链接的例子来处理32位、64位和64位的压缩OOP。它使用
它使用
它使用已知类的字段偏移量计算对象的基本大小。
|
14
3
不必处理插入等问题,如果不需要知道对象的字节确切大小,可以使用以下方法:
这样,您可以在读取之前和之后读取已用内存,并在获取已用内存之前调用GC,从而将“噪声”几乎降低到0。 为了获得更可靠的结果,您可以运行作业n次,然后将使用的内存除以n,得到一次运行需要多少内存。更重要的是,你可以把整件事情做更多次,并得出平均值。 |
15
2
如果你要求的是方法调用,那么就没有方法调用。通过一点研究,我想你可以自己写。一个特定的实例有一个固定的大小,这个大小是由引用的数量和原语值加上实例簿记数据得出的。您只需浏览对象图。行类型的变化越小,就越容易。 如果这太慢或只是比它的价值更多的麻烦,总是有很好的老式的排数规则的拇指。 |
16
2
我曾经写过一个快速测试来评估:
一般的概念是分配对象和测量空闲堆空间中的变化。关键在于
这就是我们所期望的,给定对齐行为和可能的堆块头开销。 这里的仪器方法在公认的答案中是最准确的。我描述的方法是准确的,但仅在没有其他线程创建/丢弃对象的受控条件下。 |
17
2
只需使用Java Visual VM即可。 它拥有分析和调试内存问题所需的一切。
它还有一个OQL(对象查询语言)控制台,允许您做许多有用的事情,其中之一是
|
18
1
我的答案是基于尼克提供的代码。该代码测量被序列化对象占用的总字节数。所以这实际上是测量序列化的东西+普通的对象内存占用(例如序列化
我已经用基本类型、字符串和一些普通类测试了这个解决方案。也可能没有涵盖的案例。
|
19
0
您可以生成一个堆转储(例如,使用JMAP),然后分析输出以查找对象大小。这是一个离线解决方案,但您可以检查浅尺寸和深尺寸等。 |
20
0
由于对象的创建,大小会增加JVM的内存使用量,这通常是对象的大小。 |
21
0
这个答案与对象大小无关,但当您使用数组来容纳对象时,它将为对象分配多少内存大小。 因此,数组、列表或映射所有这些集合将不会真正存储对象(仅在基元时需要实际的对象内存大小),而是只存储这些对象的引用。
现在
基元
物体
我的意思是说所有的对象引用只需要4个字节的内存。它可以是字符串引用或双对象引用,但取决于对象创建,所需的内存将有所不同。
例如,如果我为下面的类创建对象
因此,在创建对象/引用数组时,它的所有内容都将被空引用占据。我们知道每个引用需要4个字节。 最后,下面代码的内存分配是20字节。 referenceMemoryTest ref1=new referenceMemoryTest();(4(ref1)+12=16字节) referenceMemoryTest ref2=ref1;(4(ref2)+16=20字节) |
22
-4
对于jsonObject,下面的代码可以帮助您。
返回字节大小 我用JSONarray对象检查了它,并将其写入一个文件。它给出了物体的大小。 |
23
-5
我怀疑你是否想以编程的方式来做,除非你只想做一次,然后把它存储起来以备将来使用。这是一件昂贵的事情。在Java中没有siZOFF()运算符,即使存在,也只计算引用到其他对象的成本和基元的大小。 一种方法是将其序列化为文件,并查看文件的大小,如下所示:
当然,这假定每个对象都是不同的,并且不包含对其他任何对象的非瞬时引用。 另一种策略是通过反射检查每个对象的成员,并将大小相加(布尔值字节=1字节,短字符=2字节等),沿着成员层次结构向下工作。但是,这是乏味和昂贵的,并且最终做的和序列化策略一样。 |
Community wiki · 如何调试Python内存故障? 1 年前 |
tuskiomi · 如何为参考提供明确的锈蚀寿命? 2 年前 |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
mo FEAR · C++ STL映射是否在创建后移动了一个值的位置? 2 年前 |
Pooyanoss · 覆盖类的堆栈分配实例 2 年前 |
TheKing · 为什么数组的地址可以有负值? 2 年前 |
Http2inc · 如何从内存中解析这些二进制数据? 2 年前 |
tifrel · 如何检查已编译类型的表示形式? 2 年前 |
Gabriele · 释放GSL矩阵的正确方法是什么? 6 年前 |
Makogan · 3D纹理大小影响程序输出,不会引发错误 6 年前 |