一个拥有100个属性的对象所消耗的内存空间是否与100个对象各有一个属性所消耗的内存空间相同?

为一个对象分配了多少内存? 添加属性时使用了多少额外空间?


当前回答

这将是一个非常广泛的问题。

它取决于类变量,或者你可以在java中调用作为状态的内存使用。

对于头文件和引用,它还需要一些额外的内存。

Java对象使用的堆内存包括

基本字段的内存,根据它们的大小(参见下面的基本类型的大小); 用于引用字段的内存(每个4字节); 一个对象头,由几个字节的“管理”信息组成;

java中的对象还需要一些“内务”信息,比如记录对象的类、ID和状态标志,比如对象当前是否可达、当前是否同步锁定等。

Java对象头大小在32位和64位jvm上不同。

虽然这些是主要的内存消费者,jvm有时也需要额外的字段,如代码的对齐等。

基本类型的大小

布尔和字节——1

Char & short——2

Int & float—4

长双——8

其他回答

程序的总已用/空闲内存可以在程序中通过

java.lang.Runtime.getRuntime();

运行时有几个与内存相关的方法。下面的代码示例演示了它的用法。

 public class PerformanceTest {
     private static final long MEGABYTE = 1024L * 1024L;

     public static long bytesToMegabytes(long bytes) {
         return bytes / MEGABYTE;
     }

     public static void main(String[] args) {
         // I assume you will know how to create an object Person yourself...
         List <Person> list = new ArrayList <Person> ();
         for (int i = 0; i <= 100_000; i++) {
             list.add(new Person("Jim", "Knopf"));
         }

         // Get the Java runtime
         Runtime runtime = Runtime.getRuntime();

         // Run the garbage collector
         runtime.gc();

         // Calculate the used memory
         long memory = runtime.totalMemory() - runtime.freeMemory();
         System.out.println("Used memory is bytes: " + memory);
         System.out.println("Used memory is megabytes: " + bytesToMegabytes(memory));
     }
 }

我已经从另一个答案中提到的java.lang.instrument.Instrumentation方法中获得了非常好的结果。有关它的使用示例,请参阅java专家通讯和java。SourceForge上的sizeOf库。

在32位系统上,每个对象的开销似乎是16字节(在64位系统上是24字节)。

http://algs4.cs.princeton.edu/14analysis/是一个很好的信息来源。下面是一个很好的例子。

http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf的信息也非常丰富,例如:

如果它对任何人都有用,您可以从我的网站下载一个小型Java代理,用于查询对象的内存使用情况。它还可以让你查询“深层”内存使用情况。

不,注册一个对象也会占用一些内存。100个具有1个属性的对象将占用更多内存。