堆中的Java执行与c / c ++堆栈的执行有何不同?

时间:2012-01-18 19:57:49

标签: java c++ c stack heap

在c / c ++中,在堆栈上创建本地对象,并将数据从堆栈馈送到cpu寄存器。

在Java中没有堆栈,所有对象都在堆上分配,现在对于预先编写的代码,可以计算对象所需的大小,而不是每个对象堆积分配过度c c ++样式整个代码块被放置马上下来。这样,Java的堆性能几乎与c c ++中的堆栈性能相当,几乎相当。

我的问题是程序如何从堆流到最终执行?

让我们假设我运行一个将程序代码复制到内存中的函数,在程序进入堆内存后,返回程序入口点地址,如何启动它的执行?

3 个答案:

答案 0 :(得分:5)

在Java中,堆栈。仅仅因为在堆上分配对象并不意味着没有堆栈。执行不会发生在堆上,执行是从堆栈中添加和退出的方法调用,就像C / C ++的执行流程一样。

答案 1 :(得分:4)

  

在Java中没有堆栈

当然有一堆 当你执行new时,对象被分配给堆 但是参考变量例如是如果它是局部变量,则它位于堆栈上 堆栈也用于功能参数(功能框架)。

答案 2 :(得分:0)

如果你谈到堆的性能,它意味着Java的垃圾收集器(GC)的性能,它依赖于它的JIT(即时)编译器 - 一个动态地将JVM字节代码转换为机器代码的编译器。

GC可以非常高效。阅读一篇好文章garbage collection handbook,以及安德鲁的Appel旧文章Garbage Collection can be faster than stack allocation

精心设计的GC - 配合良好的JIT-可以非常快速地分配东西。世代复制GC将花费少量时间用于年轻的活体对象(因此死亡的年轻物体基本上是分配的,并且是#34;免费的#34;