Tương thích Java 32-bit và 64-bit


97

Liệu mã Java được xây dựng và biên dịch dựa trên JDK 32 bit thành mã byte 32 bit có hoạt động trong JVM 64 bit không? Hay JVM 64 bit yêu cầu mã byte 64 bit?

Để cung cấp thêm một chút chi tiết, tôi có mã đang hoạt động trong môi trường Solaris chạy JVM 32 bit, nhưng bây giờ tôi gặp sự cố sau khi nâng cấp Máy chủ JDK và Weblogic lên 64 bit.


3
hãy làm rõ "các vấn đề".
Thorbjørn Ravn Andersen

Tôi đang gặp sự cố tương tự - triển khai ứng dụng mùa xuân trên máy chủ weblogic 64 bit. Chúng tôi nhận được nhiều lớp khác nhau không tìm thấy ngoại lệ và các lỗi không hữu ích khác. Hơn nữa, nó triển khai và chạy trên một số máy 64 bit, nhưng không phải những máy khác. Tuy nhiên, chúng tôi không thể biết điều gì khác biệt. Bạn đã giải quyết được điều này?
nont 15/09/09

2
@nont - bất kể vấn đề là gì, nó không phải là biên dịch 32vs64 bit.
Stephen C

Câu trả lời:


94

Có, Java bytecode (và mã nguồn) độc lập với nền tảng, giả sử bạn sử dụng các thư viện độc lập với nền tảng. 32 so với 64 bit không thành vấn đề.


Tôi gặp phải vấn đề này trong khi tìm kiếm một câu hỏi mà tôi có. VẬY, tôi đã chạy ứng dụng của mình dưới JVM 32 bit và sử dụng thư viện gốc 64 bit. Nó chạy tốt. Nhưng khi tôi chạy ứng dụng của mình dưới JVM 64 bit và sử dụng thư viện gốc 32 bit, nó không thành công. Làm thế nào điều này có thể được? Chỉ tò mò.
Umang Desai

6
Thư viện gốc @umangdesai không phải là thư viện độc lập với nền tảng, do đó giả định không đúng.
Thorbjørn Ravn Andersen

Có phải "không thành vấn đề" có nghĩa là mã được biên dịch với 32-bit javacsẽ tận dụng bộ nhớ có sẵn với 64-bit javakhông?
Marcus Junius Brutus

1
Nếu bạn đang lo lắng về vấn đề này, hãy để ý các thư viện gốc đã được đóng gói vào một cái lọ hoạt động cho một nền tảng, nhưng không cho nền tảng gây ra sự cố cho bạn. (Nếu bạn không biết tôi đang đề cập đến điều gì, hãy xem những thứ như sau: stackoverflow.com/a/14051512/155631 ).
Matt S.

21

Tôi đã vô tình chạy ứng dụng (lớn) của chúng tôi trên máy ảo 64 bit thay vì máy ảo 32 bit và không nhận thấy cho đến khi một số thư viện bên ngoài (được gọi bởi JNI) bắt đầu bị lỗi.

Dữ liệu được tuần tự hóa trên nền tảng 32 bit được đọc trên nền tảng 64 bit mà không gặp vấn đề gì.

Bạn đang gặp vấn đề gì? Một số thứ có hiệu quả và những thứ khác thì không? Bạn đã thử đính kèm JConsole, v.v. và có đỉnh xung quanh chưa?

Nếu bạn có một máy ảo rất lớn, bạn có thể thấy rằng các vấn đề GC trong 64 bit có thể ảnh hưởng đến bạn.


1
bạn đang nói rằng các thư viện JNI sẽ không hoạt động trong máy ảo 64 bit nếu chúng là 32 bit?
C. Ross

1
Chúng không hoạt động. Một đồng nghiệp đã báo cáo rằng họ đã làm như vậy (điều mà tôi thấy đáng ngờ - ít nhất là). Tôi tự hỏi liệu anh ta có đang chạy trên Solaris và có một số kiểu đánh côn đang xảy ra. Không có; anh ấy đã nhầm và nó đang chạy dưới 32bit.
Fortyrunner

Tôi đã gặp sự cố tương tự với thư viện JNI. Không có sự tương thích giữa các thư viện 32-bit và 64-bit.
Erick Robertson

Thật vậy, các lib JNI của bạn cần được thay thế. Bạn có thể chỉ cần tải xuống bản thay thế 64bit từ trang web của nhà cung cấp. (Đó là mẹo cho tôi, cho tất cả các lib JNI mà tôi đã sử dụng).
bvdb

Đây là các thư viện nội bộ và không có phiên bản 64 bit nào tương đương, vì vậy việc quay lại 32 bit là thứ tự trong ngày ..
Fortyrunner

11

Có cho câu hỏi đầu tiên và không cho câu hỏi thứ hai; nó là một máy ảo. Sự cố của bạn có thể liên quan đến những thay đổi không xác định trong việc triển khai thư viện giữa các phiên bản. Mặc dù nó có thể là một điều kiện chủng tộc.

Có một số vòng lặp mà máy ảo phải trải qua. Đáng chú ý là các tham chiếu được xử lý trong các tệp lớp như thể chúng chiếm cùng một không gian như ints trên ngăn xếp. doublelongchiếm hai khe tham chiếu. Đối với các trường ví dụ, vẫn có một số sắp xếp lại mà máy ảo thường trải qua. Tất cả đều được thực hiện (tương đối) một cách minh bạch.

Ngoài ra, một số JVM 64-bit sử dụng "oops nén". Bởi vì dữ liệu được căn chỉnh thành khoảng 8 hoặc 16 byte, ba hoặc bốn bit của địa chỉ là vô dụng (mặc dù một bit "mark" có thể bị đánh cắp đối với một số thuật toán). Điều này cho phép dữ liệu địa chỉ 32 bit (do đó sử dụng băng thông bằng một nửa và do đó nhanh hơn) sử dụng kích thước heap 35 hoặc 36 bit trên nền tảng 64 bit.


3
Ban lam toi ngac nhien. Tôi không nghĩ rằng có một thứ như mã byte 32 bit hoặc mã byte 64 bit.
Jon Skeet

3
Đọc lại câu trả lời của bạn - bạn có chắc là bạn không chỉ nói ngược lại không? (Có rồi không.)
Jon Skeet

+1 cho Jon Skeet. Tôi đã viết cùng một bình luận nhưng đã bị gọi đi.
Michael Myers

Ý tôi là không thì có, nhưng với các câu hỏi thì ngược lại. Đã quay lại một bản chỉnh sửa và chỉnh sửa (và đưa thêm một chút thông tin vào).
Tom Hawtin - tackline

4
@Jon Skeet: không có bytecode 32 bit và 64 bit, nhưng khi JITed, các con trỏ trong JVM (thường) là 32 hoặc 64 bit, tùy thuộc vào nền tảng. Và với OOPS nén, họ có thể sử dụng con trỏ 32bit ở nhiều nơi, ngay cả trên JVM 64bit. Điều đó giúp tiết kiệm khá nhiều bộ nhớ và tăng vị trí mã, do đó dẫn đến tốc độ cao hơn.
Joachim Sauer

9

Tất cả mã byte đều dựa trên 8 bit. (Đó là lý do tại sao nó được gọi là mã BYTE) Tất cả các lệnh đều là bội số của kích thước 8 bit. Chúng tôi phát triển trên các máy 32 bit và chạy các máy chủ của mình với JVM 64 bit.

Bạn có thể cung cấp một số chi tiết về vấn đề bạn đang gặp phải? Sau đó, chúng tôi có thể có cơ hội giúp bạn. Nếu không, chúng tôi sẽ chỉ đoán xem bạn đang gặp phải vấn đề gì.


8

Trừ khi bạn có mã gốc (mã máy được biên dịch cho một arcitechture cụ thể) thì mã của bạn sẽ chạy tốt như nhau trong JVM 32 bit và 64 bit.

Tuy nhiên, lưu ý rằng do địa chỉ lớn hơn (32 bit là 4 byte, 64 bit là 8 byte) nên JVM 64 bit sẽ yêu cầu nhiều bộ nhớ hơn JVM 32 bit cho cùng một tác vụ.


Cũng xin lưu ý rằng JVM 32-bit trên hệ thống 64-bit có thể có nhiều bộ nhớ hơn JVM 32-bit trên hệ thống 32-bit, vì vậy nó có thể là một lựa chọn thú vị nếu bạn có "sử dụng một vài GB bộ nhớ " ứng dụng.
Thorbjørn Ravn Andersen

3

Sự khác biệt 32 bit so với 64 bit trở nên quan trọng hơn khi bạn đang giao tiếp với các thư viện gốc. Java 64-bit sẽ không thể giao tiếp với dll 32-bit không phải Java (thông qua JNI)


5
Bạn đã không cung cấp bất cứ điều gì mới cho câu hỏi rất cũ này.
Austin Henley


0

Java JNI yêu cầu các thư viện hệ điều hành có cùng "bittiness" như JVM. Nếu bạn cố gắng tạo thứ gì đó phụ thuộc, chẳng hạn như trên IESHIMS.DLL (nằm trong% ProgramFiles% \ Internet Explorer), bạn cần sử dụng phiên bản 32bit khi JVM của bạn là 32bit, phiên bản 64bit khi JVM của bạn là 64bit. Tương tự như vậy đối với các nền tảng khác.

Ngoài điều đó ra, bạn nên sẵn sàng. Mã bytecode của Java được tạo ra giống nhau.

Lưu ý rằng bạn nên sử dụng trình biên dịch Java 64bit cho các dự án lớn hơn vì nó có thể giải quyết nhiều bộ nhớ hơn.


-5

yo sai ở đâu! Đối với chủ đề này, tôi đã viết một câu hỏi cho oracle. Câu trả lời là.

"Nếu bạn biên dịch mã của mình trên Máy 32 Bit, thì mã của bạn chỉ nên chạy trên Bộ xử lý 32 Bit. Nếu bạn muốn chạy mã của mình trên JVM 64 Bit, bạn phải biên dịch Tệp lớp của mình trên Máy 64 Bit bằng 64 -Chụp JDK. "


5
Các định dạng mã byte mã Java thường được biên soạn để là như nhau bất kể nền tảng 32bit hoặc 64bit. Các quy tắc khác nhau đối với bất kỳ mã gốc nào nhưng mã byte Java có tính di động.
McDowell

4
Vâng, có vẻ như bất kỳ ai ở Oracle trả lời câu hỏi của bạn hoặc là đã hiểu nhầm hoặc không biết gì về JVM.
Paŭlo Ebermann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.