1. 程式人生 > 實用技巧 >32位和64位的java程式可以通用嗎

32位和64位的java程式可以通用嗎

  java程式32位和64位可以通用嗎?我一直有這個疑問,比如64位的機器上執行32位的java程式會不會有問題,直到我看到了JVM大神R大 RednaxelaFX的回答。

下面是拷貝

用32位還是64位的JDK編譯出來的Class檔案沒區別,關鍵是執行程式的JDK/JRE是多少位的,此時64位的JDK/JRE佔的包括PermGen在內的記憶體會多一些。

主要是指標的寬度變寬了,32位的指標是32位的,64位的指標是64位的,大了一倍。假設有下面的一個C語言宣告的資料結構:

struct X {
 int i;
 void* ptr;
}

  在32位條件下它或許要8位元組,而在64位條件下它或許就是12位元組。

HotSpot VM通常使用直接指標來實現java層面的物件引用。所以在64位JVM上執行程式,java物件因此而變大,JVM內部的資料結構也有些會變大。在64位JVM使用指標壓縮時,java物件的java引用可以維持跟32位JVM一樣大(每個壓縮指標佔32位),但有些JVM內部資料結構用不上壓縮指標功能,只存直接指標,所以還是要變大。

  如果某個java app有native部分,那麼native的部分也得對應上。Tomcat也可以tcnative(Tomcat Native Libary), 是用C寫的,所以有“32位Tomcat”這麼一說。

  Spring的話我印象中沒native部分。

最後自己的理解,如果程式中有native,so或者dll,那麼就是不通用的。