簡體   English   中英

Java從堆執行與從C / C ++堆棧執行有何不同?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM