Java有堆和堆栈吗?

时间:2011-11-26 18:42:10

标签: java c++

http://courses.washington.edu/css342/zander/css332/arch.html

页面底部:

  

C ++内存模型与Java内存模型不同。在C ++中,   内存来自两个地方,即运行时堆栈和内存堆。

这就好像Java没有堆(或堆栈)?

我正在尝试学习Java和C ++的所有“引擎盖”细节

3 个答案:

答案 0 :(得分:7)

Java也有一个堆和一个(每个线程)堆栈。不同之处在于,在Java中,您无法选择分配变量或对象的位置。

基本上,所有对象及其实例变量都在堆上分配,并且所有方法参数和局部变量(只是对象中的引用)都在堆栈上分配。

但是,一些现代JVM在检测到对象仅在本地使用时会在堆栈上分配一些对象作为性能优化。

答案 1 :(得分:1)

Java使用堆内存模型。所有对象都在堆上创建;引用用于指代它们。

它还在处理时将方法帧放入堆栈。

我会说它有两个。

答案 2 :(得分:1)

是的,Java既有堆(整个JVM通用)又有堆栈(每个线程一个堆栈)。

并且有堆叠& heap更像是实现的属性而不是语言。

我甚至会说大多数Linux程序都有堆(通过mmap& sbrk系统调用获得)和堆栈(在操作系统级别,这不依赖于语言)

Java有什么,但C ++通常不是,garbage collector。您不需要在Java中释放未使用的内存。但是在C ++中,你需要通过调用delete来释放它,用于在new堆中分配的每个C ++对象。

但请参阅Boehm's garbage collector了解可在C& C中使用的GC C ++。它在实践中运作良好(即使它在理论上可能泄漏,是保守的,而不是精确的GC)。

某些受限制的C ++或C环境(特别是没有操作系统内核的嵌入式系统的独立实现)没有任何堆。