Java 对象的内存预留
Memory reservation for java objects
我知道在 c++ 中声明对象实例时如下所示:
Object object
调用 Object 构造函数并为该对象提供内存,但是我发现当您在 Java 中执行此操作时,对象实例没有值,直到:
object = new Object()
被写了。我想具体知道何时为对象提供内存。我认为构造和新关键字都分配了内存,因此Object object = new Object()
似乎是多余的。我在 Oracle 的网站上读到声明"保留"内存和新的"分配"内存,我想知道两者之间有什么区别。
您需要区分变量所需的空间和对象所需的空间。请记住,变量的值只是一个引用 - 非常类似于C++中的指针。因此,如果您有:
Object x = null;
然后变量x
本身占用足够的引用空间(通常为 4 或 8 个字节)。现在,如果您有:
x = new Object();
这将创建一个对象 - x
的值现在是对新创建对象的引用。 x
本身占用的空间量与以前相同,但对象本身也需要空间(基本上是字段、对象类型的引用以及用于同步和内务管理的数据)。
当你做类似的事情时
Object object = new Object()
在 Java 中,对象是对托管堆上实际实例的引用。与C++相比,这大致是
Object* object=new Object()
所以当你这样做时
Object object;
在 Java 中,为实例的"引用"创建了一个位置。似
Object* object;
在C++。
Object foo=null;
在 C++ 的含义中创建对类对象的引用 foo。因此,它消耗内存仅供参考。
Object realFoo=new Object();
创建这样的引用,并且还创建与此对象相同的真实对象。因此,它是引用和对象本身的内存。
在 Java 中,没有内存预留 - 只有内存分配。
内存:方法中的参数和变量将在堆栈帧中为它们保留内存。
分配内存:在运行时,当执行"new"时,将为堆上的新对象分配内存
重要的是要理解,在Java中,Object object
只是对称为object
的Object
的引用。如果您熟悉C++,则可以将此引用视为指针(尽管它并不完全相同)。
在 64 位计算机上,object
引用为 8 个字节。当您实际使用 new
关键字实例化Object
并将其分配给引用时,这是为您的Object
分配内存的地方。
- 迭代时从向量和内存中删除对象
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 对具有动态分配的内存和析构函数的类对象的引用
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 有没有办法列出所有共享内存对象的名称?
- 我的共享内存对象保存在哪里
- boost共享内存对象中的指针
- 创建 boost::interprocess 共享内存对象的非共享副本
- 提升中的异常:进程间,共享内存对象删除
- 自动C++内存/对象实例管理?智能指针
- 将矢量或任何其他容器存储在boost进程间共享内存对象中
- OpenCL:减少示例,并保留内存对象/将cuda代码转换为OpenCL
- boost::创建托管共享内存对象时出现进程间ubuntu异常
- 用户可能无法在 Linux 系统上打开共享内存对象的原因
- 如何测试boost共享内存对象是否被删除?
- 将指向结构体或内存对象的空指针强制转换为新结构体
- Apache模块共享内存对象