c ++中的示例
Employee emp=new Employee();
现在创建 x 字节来存储Employee。并且 y 字节是存储引用所必需的。因此需要 x + y 字节。
现在在c ++中,因为没有垃圾收集,它的程序员有责任销毁对象。
员工emp2 = emp;
问题1:现在是否为emp2创建了一个(x + y)的地址空间?
在Java中
它只指向堆中的对象。
问题2:这是否意味着如果将相同的对象添加到java中的ArrayList中,可以说100次,那么所使用的内存只是存储堆中对象的引用? 即只使用100 * y + x的内存量?
答案 0 :(得分:2)
这是否意味着如果将相同的对象添加到java中的ArrayList中,可以说100次,那么使用的内存只是存储堆中对象的引用?即只使用100 * y + x的内存量? - 是的。在 collections 中,只添加对实际对象(几乎总是在堆上)的引用。
作为旁注,java具有 4字节引用,与架构无关(32位/ 64位)。
答案 1 :(得分:1)
函数调用的堆栈内存'局部变量;函数调用的堆栈是嵌套的。
这是变量的内存。在Java中对对象的引用。对象本身存储在堆上,垃圾回收。数组也是Java中的Object。 Java在堆栈上没有C结构。 这是一个历史性的设计决策,保持一切简单,作为“复杂”C ++的继承者。
现在在C ++中,堆栈上有一个直接的结构或数组(没有new / malloc)。然后,您需要一个复制构造函数,用于将数据从一个空间铲除到另一个空间(堆栈或堆)。
有效的区别在于,在C中,可以有一个链表,每个节点都是胖的,里面有数据。
在Java中,假设LinkedList<T>
每个节点(一个堆对象)将包含一个额外的间接,即对T数据对象的引用。
数据可以用Java共享,也可以用C语言复制。
从这个角度来看,您可以自己计算内存使用量。我觉得有必要提一下,Java的好垃圾收集总体上比malloc / free of C更好。所以Java肯定不是那么糟糕。