[英]How does Java execution from heap differ from execution from c / c++ stack?
在c / c ++中,本地对象是在堆栈上创建的,数据从堆栈馈送到cpu寄存器。
在Java中没有堆栈,所有对象都分配在堆上,现在对于预编写的代码,可以计算出对象所需的大小,而不必为每个对象堆分配使用过分的c c ++样式,一次放置整个代码块。 这样,Java的堆性能几乎与c c ++中的堆栈性能一样好,几乎可以媲美。
我的问题是程序如何从堆流到最终被执行?
假设我运行了一个函数,该程序将程序代码复制到内存中,然后将其放入堆内存中,并返回程序入口点地址,我如何启动其执行?
在Java中存在堆栈。 仅仅因为在堆上分配了对象并不意味着没有堆栈。 执行不会在堆上发生,执行是将方法调用添加到堆栈中或从堆栈中解开,就像C / C ++的执行流程一样。
在Java中没有堆栈
当然有一个堆栈。
当然,当您执行new
时,对象将分配给堆。
但是参考变量(例如,如果它是局部变量)则位于堆栈上。
堆栈也用于功能参数(功能框架)。
如果您谈到堆的性能,那么对于Java而言,这意味着其垃圾回收器(GC)的性能,这取决于其JIT(即时)编译器-一种将JVM字节码动态转换为机器代码的编译器。
GC可以非常有效。 阅读一本好的垃圾收集手册 ,还可以找到Andrew's Appel的旧论文《 垃圾收集》比堆栈分配更快
精心设计的GC-与精心设计的JIT-可以真正快速地分配事务。 世代复制的GC将花费少量时间在年轻的活物上(因此,已死亡的年轻物实质上是免费的“大量”分配)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.