32位和64位的java程式可以通用嗎
阿新 • • 發佈:2020-08-24
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,那麼就是不通用的。