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,那么就是不通用的。