在java中可以使用静态内存分配和动态内存分配创建对象吗?
答案 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。