【发布时间】:2011-03-02 22:37:23
【问题描述】:
我的问题与 java 中没有数据成员的类的内存占用有关。假设在java中我有一个没有数据成员的类,它只包含方法。因此,如果我正在创建特定类的实例,那么它是否会占用除对象引用内存之外的主内存中的内存?
【问题讨论】:
标签: java performance memory-management garbage-collection
我的问题与 java 中没有数据成员的类的内存占用有关。假设在java中我有一个没有数据成员的类,它只包含方法。因此,如果我正在创建特定类的实例,那么它是否会占用除对象引用内存之外的主内存中的内存?
【问题讨论】:
标签: java performance memory-management garbage-collection
最终,每个 Java 对象都知道它的类,并且可以选择附加一个同步原语(尽管this 可以是合成的)。这是两个很难让java.lang.Object 实例没有的引用。其他所有内容都来自该类,因此您有一个成本下限,至少为8 bytes in Java 1.3.1。如果您确实需要,分析器会告诉您当前的成本。
【讨论】:
由于各种干扰源(堆增长、GC),对内存进行基准测试很困难,但仍然值得一试:
public static void main(String[] args)
{
final int n = 1000000;
final Runtime runtime = Runtime.getRuntime();
final Object[] objects = new Object[n];
final long memory0 = runtime.totalMemory() - runtime.freeMemory();
for (int i = 0; i < objects.length; i++)
{
objects[i] = new Object();
}
final long memory1 = runtime.totalMemory() - runtime.freeMemory();
final long memory = memory1 - memory0;
System.out.printf(
"%s %s\n",
System.getProperty("java.vm.name"),
System.getProperty("java.vm.version"));
System.out.printf("%d %d %.1f\n", n, memory, 1.0 * memory / n);
}
Java HotSpot(TM) 服务器虚拟机 14.3-b01 1000000 8000336 8.0
【讨论】:
让我们说清楚。当然,对您的对象的引用会占用空间。但是您的对象还将为其“this”指针占用空间(即,您可以区分不同的实例)以及任何超类的字段 - 例如对象 - 最后是堆内部数据结构的开销。
【讨论】:
是的,确实如此,因为至少“空”对象也有指向其类型信息的指针。
【讨论】:
this派生出来的,原始对象的大小是从类型知道的,终结处理保持在对象之外(即找出一个对象是否被如果您不是内存管理器,finalized 相对昂贵)。