【问题标题】:When does memory gets allocated to the object(POJO) in Java什么时候将内存分配给Java中的对象(PO​​JO)
【发布时间】:2017-09-06 04:44:57
【问题描述】:
Class Abc {
    Integer a;
    Integer b;
    Integer c;
    getters();
    setters();
}

当我创建对象 Abc abc = new Abc() 即 12 字节(整数为 4 字节)或为变量设置一些值(如 setA(10).)时是否分配内存?

【问题讨论】:

  • 假设您的意思是堆内存而不是堆栈:对于此类,当您调用 new 时,您会分配 3x8 = 24 个字节(众所周知,Java 引用通常需要 8 个字节,而您有 3 个其中),然后在创建时至少为每个 Integer 再增加 4 个字节。另外,在加载类文件时,Class 本身有一次分配(不知道有多少字节,请查看类文件)。
  • 内存在对象初始化时分配(即new Object())。但是,int 每个需要 4 个字节,而您正在使用 Integer 包装器(盒装)类,这将需要更多内存。
  • 调用new时分配内存。
  • 这篇文章可能有助于理解。 link
  • 对象创建期间分配的实例变量的内存,类加载期间创建的静态变量的内存

标签: java jvm


【解决方案1】:

当我创建对象 Abc abc = new Abc() 即 12 字节(整数为 4 字节)时是否分配内存。

是的。更具体地说,它是在 Abc 类的构造函数链被调用之前立即分配的。

但是,分配的空间还包括一些标头信息,并且您的示例中的数量将取决于 JVM 是使用 32 位还是 64 位地址进行引用。 (Integer 类型是引用类型!)

(假设 32 位引用,大小可能是 3 x 4 字节 + 8 字节标头 + 4 字节填充;即 24 字节。但是这是特定于 JVM 实现的。)


或者当我为 setA(10) 等变量设置一些值时。

这取决于setA 方法的签名以及它的实现方式。问题是是否存在 int -> Integer 的自动装箱以及发生的地点/时间。

但是,在所有情况下,(可能)分配的Integer 对象都不是Abc 对象的一部分。 Abc 对象有字段来保存对Integer 对象的引用,这些字段的空间是Abc 对象的一部分……这意味着它是在分配该对象时分配的,而不是在设置字段时分配的。

【讨论】:

  • Map<String, String> map = new HashMap<String, String>();分配了多少内存?
  • 您可以随时查看源代码并自己解决。
猜你喜欢
  • 2011-03-17
  • 2015-01-22
  • 2015-09-15
  • 2011-11-20
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
相关资源
最近更新 更多