2009-12-02 3 views
8

JarBundler를 사용하여 패키지 된 Java 앱이 있습니다. 응용 프로그램은 상당히 CPU 집약적입니다 (많은 큰 Collection.sort() 호출).64 비트 Java VM이 앱 실행 속도가 10 배 느립니다.

Mac OS에서 64 비트 JavaApplicationStub를 사용할 때 응용 프로그램이 느리고 느리게 실행됩니다. 이 JavaApplicationStub 파일은 Java 64 비트 VM을 시작합니다.

32 비트 전용 오래된 JavaApplicationStub 파일을 발견했습니다. 나는 Bundle에서 그것을 바꿨고, 앱은 10 배 빠르게 실행되었다. (결과적으로 응용 프로그램이 실행될 때 32 비트 VM이 사용됩니다).

이 말이 맞는가요? 64 비트 VM이 왜 그렇게 느린 것일까 요? 앱을 만들고 JavaApplicationStub 파일을 해킹하는 것이 이치에 맞습니까?

조언을드립니다.

+2

그냥 검사를 얻을 수 있지만, 당신이 실행중인 하드웨어가 무엇 결과 무엇을 말해? –

+1

특히 얼마나 많은 기억력을 가지고 있습니까? 기계가 교체중인 경우 활동 뷰어에 확인하십시오. –

+0

MacBook Core 2 Duo에서 실행 10.5.8 – craiglurey

답변

5

64 비트 JVM 실행의 장점/단점에 대해 this post을 참조하십시오. 요약하면, 포인터 역 참조는 &보다 오래 걸릴 수 있습니다. 더 큰 데이터 구조 (32 비트가 아닌 64 비트)를 사용하면 명시 적으로 사용하지 않는 한 이점이 없습니다.

성능이 감소하는 이유는 실제로 :

또한 당신이 발생하는과에 - 라인 64 비트, 이동 때 최대 85 %의 성능 감소를 논의 this relevant article를 참조하십시오 메모리 증가와 관련이 있습니다. Java 커버 아래에있는 메모리 참조는 WAS 런타임 및 응용 프로그램 객체의 메모리 구조 크기가 두 배로 커졌습니다. 불행하게도 프로세서 메모리 캐시 크기는 동시에 커지지 않았습니다. 이는 더 많은 메모리 캐시 미스를 의미합니다. 즉, 더 큰 메모리를 다루는 하드웨어에 대한 작업량이 많아 지므로 응용 프로그램 성능이 저하됩니다.

+1

32 비트를 고수하는 것이 답이라면이를 강제하는 가장 좋은 방법은 무엇일까요? JavaApplicationStub를 32 비트 버전으로 되 돌리거나 다른 VM 매개 변수로 실행해야합니까? – craiglurey

+0

저는 JavaApplicationStub/mac 사용자가 아니며 관련 문서를 찾을 수 없지만 표준 Sun jvm에서는 32 비트 모드에서 64 비트 JVM을 실행할 수있는 옵션이 없습니다. (http : //java.sun.com/javase/technologies/hotspot/vmoptions.jsp#BehavioralOptions) 가능한 경우 32 비트 빌드를 사용하십시오. – Joel

-1

64 비트가 느리지 않습니다. 시도 :

public class Benchmark { 
public static void main(String args[]) { 
long time = System.currentTimeMillis(); 
for (int a = 1; a < 900000000; a++) { 
    for (int b = 1; b < 20; b++) { 
    } 
} 
long time2 = System.currentTimeMillis() - time; 
System.out.println("\nTime counter stopped: " + time2); 
32

}

64 당신은

관련 문제