[英]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.