当前位置:首页 > 内存 > 正文

关于对象成员占用内存

  • 内存
  • 2024-06-10 13:56:16
  • 2759

一、对象的成员方法占不占内存?然而,一个类生成的所有对象共享一个方法来节省内存。所以不一定有一对新的对象,新的内存分配给方法。


二、一个Java对象到底占用多大内存Objecto=newObject():
在Java中,空对象占用8个字节,对象引用占用4个字节。所以上面语句占用的空间为4字节+8字节=12字节。Java中的内存分配是8的倍数,因此分配的内存是16字节。
例如:
ClassO{
。inti;
bytej;
Strings;

其占用内存大小等于空对象(8)+int(4)+byte(1)+string引用(4)=17字节,因为是8的整数倍,所以它的大小是24字节。
当然,如果类中还有其他对象,还必须包括其他对象的空间。


三、如何计算java对象占用的内存Java的一大优点是Java的垃圾收集机制。该机制集成到JVM中,对程序员来说是隐藏且不透明的。这种情况下,如何获取一个对象消耗的内存呢?
曾经看到有人用下面的方法来计算:在生成对象之前和之后调用mory()方法,然后看两者的差异来计算数量被物体消耗。
该方法的代码为:

这个想法是正确的,但实际上jvm的freememory经常可能无法反映实际的可用内存。例如,当jvm需要执行垃圾回收时,空闲
内存就会收缩。如果在对象生成之后、第二次调用mory()之前确定垃圾回收时间,则对象消耗的内存量将被错误地增加。
中提到了time().totalMemory();必须计算这两个时间才能得到内存的消耗量。
ByTonySinte源代码:
s
Object[]array=newObject[_SIZE];
time().gc();
longstart=time().totalMemory();
for(inti)=0;i<_SIZE;i++){
array[i]=newObject();
}
time().gc();
longend=运行时。getRuntime().totalMemory();
longdifference=(start-end)/_SIZE;
n(difference+"bytesused
perobjectonaverage");
}





此时其实还不稳定。
因此,只有当内存不再发生明显变化,或者已经稳定下来时,我们才能说垃圾回收完成了。
如何才能真正保证jvm垃圾回收初步完成呢?实现该函数的代码如下:
s_mory();
privatestaticvoidrunGC()throwsException