2009-07-22 23 views
8

我有一個C程序來檢查機器是否棧或下長大的內存你會如何發現一臺機器的堆棧在內存中增長還是減少? (JAVA)

,過程大概是:

#include <stdio .h> 

void sub(int *a) { 
int b; 

if (&b > a) { 
    printf("Stack grows up."); 
} else { 
    printf("Stack grows down."); 
} 
} 

main() { 
int a; 
sub(&a); 
} 

現在我想做的事情在Java中相同。 :-)

任何人都知道沒有寫任何本地代碼的解決方案?

感謝

+0

順便說一句,你爲什麼要在Java中做同樣的事情?純粹的好奇心? – 2009-07-22 09:47:00

+0

沒有,我在谷歌問這個問題。然後面試官讓我用java實現這個。 :-) – Roman 2009-07-22 12:55:06

+0

此代碼已損壞。更多細節在我的答案下面。 – sigjuice 2009-07-22 17:41:23

回答

14

如果你沒有做任何本地代碼,那麼我無法想象的情況下它可能在純Java代碼無所謂。畢竟,Java堆棧可能被分配在任何方向,而不是一個嚴格連續的內存塊(如機器堆棧)。

2

哇,你將無法從Java這樣簡單的代碼中獲得任何有用的信息,至少我不知道。

你的代碼做了很多假設,即使在C中,實際上也可能不是真的。它將取決於正在運行程序的平臺和操作系統。

在Java中,您將完全依賴於JVM的尋址實現,因此無法執行此操作。

我的第一個答案是使用探查器。您也可以使用API provided (JVMTI)創建您自己的性能分析代理。這肯定比你的方法複雜得多,但你應該能夠得到你所需要的。

IBM也有這種page可以幫忙。

這是幾乎所有我對這個問題,我希望它會幫助你

6

Java源代碼編譯爲Java字節碼是一樣的語言的組件運行在JVM上。 JVM是一個虛擬機,所以在使用堆疊和堆疊的機器上它看起來完全一樣定義

因此,無法知道某個特定的機器堆棧是從Java代碼增長還是減少。

6

這不能在Java代碼中完成。它也不能在C代碼中完成。您發佈的代碼調用未定義的行爲(&b > a)。根據標準,比較兩個指針的結果是不確定的,除非指針指向同一個數組內的元素。該標準沒有提到堆棧增長的方向或堆棧是否存在。