32 비트 JDK에 대해 빌드되고 컴파일 된 Java 코드가 64 비트 JVM에서 작동합니까? 아니면 64 비트 JVM에 64 비트 바이트 코드가 필요합니까?
좀 더 자세히 설명하기 위해 32 비트 JVM을 실행하는 Solaris 환경에서 작동하는 코드가 있지만 이제 JDK 및 Weblogic Server를 64 비트로 업그레이드 한 후 문제가 발생합니다.
32 비트 JDK에 대해 빌드되고 컴파일 된 Java 코드가 64 비트 JVM에서 작동합니까? 아니면 64 비트 JVM에 64 비트 바이트 코드가 필요합니까?
좀 더 자세히 설명하기 위해 32 비트 JVM을 실행하는 Solaris 환경에서 작동하는 코드가 있지만 이제 JDK 및 Weblogic Server를 64 비트로 업그레이드 한 후 문제가 발생합니다.
답변:
예, Java 바이트 코드 (및 소스 코드)는 플랫폼 독립적 인 라이브러리를 사용한다고 가정하면 플랫폼 독립적입니다. 32 비트 대 64 비트는 중요하지 않습니다.
javac
가 64 비트로 제공되는 메모리를 활용 한다는 것을 의미 java
합니까?
실수로 32 비트 VM이 아닌 64 비트 VM에서 (대형) 애플리케이션을 실행했으며 일부 외부 라이브러리 (JNI에서 호출)가 실패하기 시작할 때까지 알아 차리지 못했습니다.
32 비트 플랫폼에서 직렬화 된 데이터는 문제없이 64 비트 플랫폼에서 읽혔습니다.
어떤 종류의 문제가 발생합니까? 일부는 작동하고 다른 것은 작동하지 않습니까? JConsole 등을 연결해 보았고 주변에 정점이 있습니까?
매우 큰 VM이있는 경우 64 비트의 GC 문제가 영향을 미칠 수 있습니다.
첫 번째 질문에는 예, 두 번째 질문에는 아니요. 가상 머신입니다. 문제는 버전 간 라이브러리 구현의 지정되지 않은 변경과 관련이있을 수 있습니다. 예를 들어 경쟁 조건 일 수 있습니다.
VM이 거쳐야하는 몇 가지 후프가 있습니다. 특히 참조는 int
스택에서 s 와 동일한 공간을 차지하는 것처럼 클래스 파일에서 처리됩니다 . double
그리고 long
두 개의 기준 슬롯을 차지합니다. 인스턴스 필드의 경우 일반적으로 VM이 어쨌든 진행되는 재정렬이 있습니다. 이것은 모두 (상대적으로) 투명하게 수행됩니다.
또한 일부 64 비트 JVM은 "압축 된 oops"를 사용합니다. 데이터가 8 바이트 또는 16 바이트마다 정렬되기 때문에 주소의 3-4 비트는 쓸모가 없습니다 (일부 알고리즘에서는 "마크"비트가 도용 될 수 있음). 이를 통해 32 비트 주소 데이터 (따라서 대역폭의 절반을 사용하므로 더 빠름)가 64 비트 플랫폼에서 35 비트 또는 36 비트의 힙 크기를 사용할 수 있습니다.
네이티브 코드 (특정 아키텍처를 위해 컴파일 된 기계 코드)가없는 경우 코드는 32 비트 및 64 비트 JVM에서 똑같이 잘 실행됩니다.
그러나 더 큰 주소 (32 비트는 4 바이트, 64 비트는 8 바이트)로 인해 64 비트 JVM은 동일한 작업에 대해 32 비트 JVM보다 더 많은 메모리를 필요로합니다.
32 비트와 64 비트의 차이는 네이티브 라이브러리와 인터페이스 할 때 더욱 중요해집니다. 64 비트 Java는 JNI를 통해 32 비트 비 Java dll과 인터페이스 할 수 없습니다.
exe를 생성하는 동안 구성에서 아래와 같이 매개 변수를 추가하십시오.
도움이되기를 바랍니다.
감사...
/ jav
Java JNI에는 JVM과 동일한 "비트 성"의 OS 라이브러리가 필요합니다. 예를 들어 IESHIMS.DLL (% ProgramFiles % \ Internet Explorer에 있음)에 의존하는 것을 빌드하려는 경우 JVM이 32 비트 인 경우 32 비트 버전을, JVM이 64 비트 인 경우 64 비트 버전을 가져와야합니다. 다른 플랫폼에서도 마찬가지입니다.
그 외에는 모든 준비가 완료되어야합니다. 생성 된 자바 바이트 코드 s / b는 동일합니다.
더 많은 메모리를 처리 할 수 있으므로 더 큰 프로젝트에는 64 비트 Java 컴파일러를 사용해야합니다.
요 어디 잘못 됐어! 이 주제에 대해 저는 오라클에 질문을 썼습니다. 대답은이었습니다.
"32 비트 머신에서 코드를 컴파일하는 경우 코드는 32 비트 프로세서에서만 실행되어야합니다. 64 비트 JVM에서 코드를 실행하려면 64 비트 머신에서 64 비트 머신에서 클래스 파일을 컴파일해야합니다. -Bit JDK. "