Java 检测对象大小
Java Instrumentation finding object size
计算 Java 对象大小时
Class Test {
private String name = null;
private List<String> myList = null;
}
Test class 对象的大小是否真的会因列表中的一项与列表中的一千项不同而不同?
嗯,这取决于你想怎么算。
Test
实例本身不会更大,它只是引用了一个 List
实例(或 null
,但它也占用了相同数量的 space),并且 List
实例是它自己的对象,存储在堆上的其他地方( 在 之外 Test
实例)。
List
实例(取决于实现)的大小也不会变化,但它会反过来引用其他对象(列表条目、数组或其他对象)。
一般来说,Java 中的所有 class 个实例占用固定的内存分配,该内存分配由 class 决定,并且不会因实例而异。唯一可以具有 "dynamic" 大小的是数组(但它并不是那么动态,因为它在数组创建时间上也是固定的,因此它可能因实例而异,但对于给定实例而言不会随着时间的推移而变化)
如果你想计算Test
对象和所有dependencies/contents所需的所有内存的"closure over the object graph"(例如估计需要多少内存来序列化它一个文件),那么是的,它会根据列表中的对象数量而增长。
另请注意,带有 ["foo", "foo"]
的 ArrayList
可能会消耗与 ["foo", "foo", "foo"]
相同的 space 总量(因为重复使用了相同的单个字符串实例三次,而后备数组无论如何都有八个条目)。或者您可能有多个 Test
个实例共享同一个 List
。所以没那么简单,要看你怎么算。
计算 Java 对象大小时
Class Test {
private String name = null;
private List<String> myList = null;
}
Test class 对象的大小是否真的会因列表中的一项与列表中的一千项不同而不同?
嗯,这取决于你想怎么算。
Test
实例本身不会更大,它只是引用了一个 List
实例(或 null
,但它也占用了相同数量的 space),并且 List
实例是它自己的对象,存储在堆上的其他地方( 在 之外 Test
实例)。
List
实例(取决于实现)的大小也不会变化,但它会反过来引用其他对象(列表条目、数组或其他对象)。
一般来说,Java 中的所有 class 个实例占用固定的内存分配,该内存分配由 class 决定,并且不会因实例而异。唯一可以具有 "dynamic" 大小的是数组(但它并不是那么动态,因为它在数组创建时间上也是固定的,因此它可能因实例而异,但对于给定实例而言不会随着时间的推移而变化)
如果你想计算Test
对象和所有dependencies/contents所需的所有内存的"closure over the object graph"(例如估计需要多少内存来序列化它一个文件),那么是的,它会根据列表中的对象数量而增长。
另请注意,带有 ["foo", "foo"]
的 ArrayList
可能会消耗与 ["foo", "foo", "foo"]
相同的 space 总量(因为重复使用了相同的单个字符串实例三次,而后备数组无论如何都有八个条目)。或者您可能有多个 Test
个实例共享同一个 List
。所以没那么简单,要看你怎么算。