Java 32 비트와 64 비트 호환성


97

32 비트 JDK에 대해 빌드되고 컴파일 된 Java 코드가 64 비트 JVM에서 작동합니까? 아니면 64 비트 JVM에 64 비트 바이트 코드가 필요합니까?

좀 더 자세히 설명하기 위해 32 비트 JVM을 실행하는 Solaris 환경에서 작동하는 코드가 있지만 이제 JDK 및 Weblogic Server를 64 비트로 업그레이드 한 후 문제가 발생합니다.


3
"문제"를 명확히하십시오.
Thorbjørn Ravn Andersen

비슷한 문제가 있습니다-64 비트 웹 로직 서버에 스프링 앱을 배포하는 것입니다. 다양한 클래스를 찾을 수 없음 예외 및 기타 도움이되지 않는 오류가 발생합니다. 또한 일부 64 비트 시스템에서 배포하고 실행하지만 다른 시스템에서는 실행하지 않습니다. 그러나 무엇이 다른지 알 수 없습니다. 이 문제를 해결 했습니까?
nont

2
@nont-문제가 무엇이든, 32vs64 비트 컴파일이 아닙니다.
Stephen C

답변:


94

예, Java 바이트 코드 (및 소스 코드)는 플랫폼 독립적 인 라이브러리를 사용한다고 가정하면 플랫폼 독립적입니다. 32 비트 대 64 비트는 중요하지 않습니다.


나는 내가 가진 질문을 검색하는 동안 이것을 만났다. 그래서 32 비트 JVM에서 애플리케이션을 실행하고 64 비트 네이티브 라이브러리를 사용했습니다. 잘 돌아갔다. 하지만 64 비트 JVM에서 애플리케이션을 실행하고 32 비트 네이티브 라이브러리를 사용하면 실패합니다. 이것이 어떻게 가능할까요? 그냥 궁금해.
Umang Desai 2013 년

6
@umangdesai 네이티브 라이브러리는 플랫폼 독립적 인 라이브러리가 아니므로 가정이 유지되지 않습니다.
Thorbjørn Ravn Andersen jul

"문제가되지 않는다"는 것은 32 비트로 컴파일 된 코드 javac가 64 비트로 제공되는 메모리를 활용 한다는 것을 의미 java합니까?
Marcus Junius Brutus 2015 년

1
이 문제에 시달리면 하나의 플랫폼에서 작동하는 jar에 번들로 제공되는 네이티브 라이브러리를 조심하십시오. (내가 무엇을 말하고 있는지 모른다면 다음과 같은 것을 참조하십시오 : stackoverflow.com/a/14051512/155631 ).
Matt S.

21

실수로 32 비트 VM이 아닌 64 비트 VM에서 (대형) 애플리케이션을 실행했으며 일부 외부 라이브러리 (JNI에서 호출)가 실패하기 시작할 때까지 알아 차리지 못했습니다.

32 비트 플랫폼에서 직렬화 된 데이터는 문제없이 64 비트 플랫폼에서 읽혔습니다.

어떤 종류의 문제가 발생합니까? 일부는 작동하고 다른 것은 작동하지 않습니까? JConsole 등을 연결해 보았고 주변에 정점이 있습니까?

매우 큰 VM이있는 경우 64 비트의 GC 문제가 영향을 미칠 수 있습니다.


1
32 비트 인 경우 JNI 라이브러리가 64 비트 VM에서 작동하지 않는다는 말입니까?
C. Ross

1
그들은 작동하지 않습니다. 한 동료가 그들이 그렇게했다고보고했습니다 (나는 의심 스럽습니다. 나는 그가 솔라리스에서 실행되고 있는지 그리고 어떤 종류의 썽킹이 진행되고 있는지 궁금했습니다. 없었습니다. 그는 착각했고 32 비트에서 실행되고있었습니다.
Fortyrunner 2010-06-28

JNI 라이브러리와 비슷한 문제가 있습니다. 32 비트와 64 비트 라이브러리간에 호환성이 없었습니다.
Erick Robertson

실제로 JNI 라이브러리를 교체해야합니다. 공급 업체의 웹 사이트에서 64 비트 대안을 다운로드 할 수 있습니다. (내가 사용한 모든 JNI 라이브러리에 대해 트릭을 수행했습니다.)
bvdb

다음은 내부 라이브러리했고, 어떤 64 비트 상당 그래서 다시 32 비트, 일의 순서 가능했다 없었다 ..
Fortyrunner

11

첫 번째 질문에는 예, 두 번째 질문에는 아니요. 가상 머신입니다. 문제는 버전 간 라이브러리 구현의 지정되지 않은 변경과 관련이있을 수 있습니다. 예를 들어 경쟁 조건 일 수 있습니다.

VM이 거쳐야하는 몇 가지 후프가 있습니다. 특히 참조는 int스택에서 s 와 동일한 공간을 차지하는 것처럼 클래스 파일에서 처리됩니다 . double그리고 long두 개의 기준 슬롯을 차지합니다. 인스턴스 필드의 경우 일반적으로 VM이 어쨌든 진행되는 재정렬이 있습니다. 이것은 모두 (상대적으로) 투명하게 수행됩니다.

또한 일부 64 비트 JVM은 "압축 된 oops"를 사용합니다. 데이터가 8 바이트 또는 16 바이트마다 정렬되기 때문에 주소의 3-4 비트는 쓸모가 없습니다 (일부 알고리즘에서는 "마크"비트가 도용 될 수 있음). 이를 통해 32 비트 주소 데이터 (따라서 대역폭의 절반을 사용하므로 더 빠름)가 64 비트 플랫폼에서 35 비트 또는 36 비트의 힙 크기를 사용할 수 있습니다.


3
놀랐 잖아. 32 비트 바이트 코드 나 64 비트 바이트 코드 같은 것이 없다고 생각했습니다.
Jon Skeet

3
당신의 대답을 다시 읽으십시오-당신은 그 반대의 뜻이 아니라고 확신하십니까? (예, 아니오)
Jon Skeet

+1 Jon Skeet. 나는 같은 댓글을 쓰고 있었는데 전화를 받았다.
Michael Myers

나는 그렇지 않다는 것을 의미했다. 그러나 다른 방법으로 질문을 던졌다. 편집을 롤백하고 편집했습니다 (좀 더 많은 정보를 입력).
Tom Hawtin-tackline

4
@Jon Skeet : 32 비트 및 64 비트 바이트 코드는 없지만 JIT 할 때 JVM의 포인터는 플랫폼에 따라 (보통) 32 비트 또는 64 비트입니다. 압축 된 OOPS를 사용하면 64 비트 JVM에서도 여러 위치에서 32 비트 포인터를 사용할 수 있습니다. 이는 상당한 메모리를 절약하고 코드 지역성을 증가시켜 속도를 향상시킵니다.
Joachim Sauer

9

모든 바이트 코드는 8 비트 기반입니다. (이것이 바로 BYTE 코드라고 불리는 이유입니다) 모든 명령어는 크기가 8 비트의 배수입니다. 32 비트 머신에서 개발하고 64 비트 JVM으로 서버를 실행합니다.

현재 직면하고있는 문제에 대해 자세히 설명해 주시겠습니까? 그러면 우리가 당신을 도울 수있는 기회가있을 것입니다. 그렇지 않으면 우리는 당신이 가지고있는 문제가 무엇인지 추측 할 것입니다.


8

네이티브 코드 (특정 아키텍처를 위해 컴파일 된 기계 코드)가없는 경우 코드는 32 비트 및 64 비트 JVM에서 똑같이 잘 실행됩니다.

그러나 더 큰 주소 (32 비트는 4 바이트, 64 비트는 8 바이트)로 인해 64 비트 JVM은 동일한 작업에 대해 32 비트 JVM보다 더 많은 메모리를 필요로합니다.


또한 64 비트 시스템의 32 비트 JVM은 32 비트 시스템의 32 비트 JVM보다 더 많은 메모리를 사용할 수 있으므로 "몇 GB의 메모리를 사용하는 경우 흥미로운 옵션이 될 수 있습니다. " 신청.
Thorbjørn Ravn Andersen 2013-06-07

3

32 비트와 64 비트의 차이는 네이티브 라이브러리와 인터페이스 할 때 더욱 중요해집니다. 64 비트 Java는 JNI를 통해 32 비트 비 Java dll과 인터페이스 할 수 없습니다.


5
이 아주 오래된 질문에 새로운 것을 제공하지 않았습니다.
Austin Henley


0

Java JNI에는 JVM과 동일한 "비트 성"의 OS 라이브러리가 필요합니다. 예를 들어 IESHIMS.DLL (% ProgramFiles % \ Internet Explorer에 있음)에 의존하는 것을 빌드하려는 경우 JVM이 32 비트 인 경우 32 비트 버전을, JVM이 64 비트 인 경우 64 비트 버전을 가져와야합니다. 다른 플랫폼에서도 마찬가지입니다.

그 외에는 모든 준비가 완료되어야합니다. 생성 된 자바 바이트 코드 s / b는 동일합니다.

더 많은 메모리를 처리 할 수 ​​있으므로 더 큰 프로젝트에는 64 비트 Java 컴파일러를 사용해야합니다.


-5

요 어디 잘못 됐어! 이 주제에 대해 저는 오라클에 질문을 썼습니다. 대답은이었습니다.

"32 비트 머신에서 코드를 컴파일하는 경우 코드는 32 비트 프로세서에서만 실행되어야합니다. 64 비트 JVM에서 코드를 실행하려면 64 비트 머신에서 64 비트 머신에서 클래스 파일을 컴파일해야합니다. -Bit JDK. "


5
일반적으로 컴파일 되는 바이트 코드 형식 Java 코드는 32 비트 또는 64 비트 플랫폼에 관계없이 동일합니다. 규칙은 모든 원시 코드에 대해 다르지만 Java 바이트 코드는 이식 가능합니다.
McDowell

4
예, Oracle의 누구든지 귀하의 질문에 답한 사람이 오해했거나 JVM에 대해 전혀 몰랐던 것 같습니다.
Paŭlo Ebermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.