在java中可以使用静态内存分配和动态内存分配创建对象吗?

时间:2009-08-30 18:43:31

标签: java object memory-management

在java中可以使用静态内存分配和动态内存分配创建对象吗?

4 个答案:

答案 0 :(得分:2)

如果通过静态内存,你的意思是在堆栈上,不,所有对象都在堆上分配。只在堆栈上分配基元。

编辑:我仍然不确定动态和静态是否分别表示堆和堆栈,但这通常是来自具有C / C ++背景的人的问题,因为这些语言让开发人员可以控制这一点。

在Java中,当你做一个典型的:

 Object o = new Object();

这将在堆上分配内存。如果你在一个方法内:

 int i = 1;

然后在堆栈上分配int(如果它是类中的一个字段,那么它将在堆上分配)。

答案 1 :(得分:0)

所有实例内存(通过调用new)都在堆上分配,所有参数都在堆栈上分配。但是java(非原始)参数都是通过引用传递的(例外情况)。

答案 2 :(得分:0)

'静态'并不意味着'在堆栈上'。

在类静态变量或static code blocks的初始化中分配的对象是静态分配的,因为分配是在类加载时完成的(可以在程序启动后立即静态发生) )。

理论上,你可以只使用这样的分配来编写一个java程序,它就是statically allocated,就像一个从未调用过malloc的C程序一样,只是为它想要的东西安装了固定的缓冲区

如果这样的程序成功启动,则证明有足够的内存可用于它可以执行的所有操作,因此它永远不会出现内存不足错误,碎片问题或GC暂停。

如果写得正确,它会返回很多错误消息,上面写着“我不能那样做”。

答案 3 :(得分:-1)

声称非原语总是在堆上分配的答案都是错误的。

JVM可以escape analysis来确定对象是否总是局限于单个线程,并且对象的生命周期受给定堆栈帧的生命周期的限制。如果它可以确定可以在堆栈上分配对象,则JVM可以在那里分配它。

有关详细信息,请参阅this article