java中DirectByteBuffer的堆内存占用是多少?

java中DirectByteBuffer的堆内存占用是多少?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,DirectByteBuffer的绝大多数(如果足够大的话)都是从Java堆中分配的。但是它的一部分仍然会在堆上,即使它很小 任何大小的DirectByteBuffer在堆上占用多少字节?一个非常小的数字。足够其监视器、类引用、标记、位置、限制和容量,以及对直接数据数组的引用 如果数据数组足够小,以至于您不得不担心开销,那么您可能根本不应该使用它。这显然是实现定义的,因为Java规范没有对此做出任何保证。对于现代hotspot VM:每个对象有2个字的开销(确切地说,即使对象没有变量,也至少有1

DirectByteBuffer的绝大多数(如果足够大的话)都是从Java堆中分配的。但是它的一部分仍然会在堆上,即使它很小


任何大小的DirectByteBuffer在堆上占用多少字节?

一个非常小的数字。足够其监视器、类引用、标记、位置、限制和容量,以及对直接数据数组的引用


如果数据数组足够小,以至于您不得不担心开销,那么您可能根本不应该使用它。

这显然是实现定义的,因为Java规范没有对此做出任何保证。对于现代hotspot VM:每个对象有2个字的开销(确切地说,即使对象没有变量,也至少有1个字)。现在你基本上要数数了。每个对象都必须对齐8字节

例如,让我们看看DirectByteBuffer:我们看到它存储一个对象(1个单词)。现在,如果它与其他对象共享此对象,则您可能希望也可能不希望计算它。如果您计算它,您将必须找出存储的对象并计算其大小(因此取决于您的确切代码路径)。由于DirectByteBuffer扩展了一个类,因此您还必须将该大小添加到该类中


是的,这是一项相当艰巨的工作,我肯定他妈的不会为你做的;)但这很简单。我统计了至少3个引用和29字节的原语。

我使用了大量的引用和原语。这就是问题所在。我的假设是直接数据数组的64位引用,类引用的64位,标记、位置、限制和容量的32*4位。我假设是64位jvm。