2008-12-12 4 views
2

Sun Java 1.4.2 VM에서 실행중인 일부 이전 Java 소스를 Sun Java (JRE) 6 VM으로 방금 업그레이드했습니다. . 다소 변경된 것은 추상적 인 객체 (Hashmap, Vector 등)에 대한 명시적인 데이터 유형을 추가하는 것이 었습니다. 코드 자체는 매우 메모리 집약적이며 최대 1G의 힙 메모리를 사용합니다 (VM을 시작하는 매개 변수로 -Xmx1024m 사용).Java 1.4.2에서 Java 6 (둘 다 Sun VM)로 업데이트하면 성능이 저하됨

최신 Java VM에서 성능 향상에 대해 많이 읽었으므로이 업그레이드를 수행 한 이유 중 하나였습니다.

  1. 누구나 지금 내 경우에는 성능이 왜 나쁜지 생각할 수 있습니까? (물론 일반적으로, 물론 코드를 살펴볼 수 없기 때문입니다)?
  2. 기존 코드를 최적화 (속도를 현명하게)하고 싶다면 자바 전문가가 아닌 사람에게 조언을 구하십시오. 힌트, 추천 문서, 도구는 무엇입니까?

감사합니다.

+0

나는 이것이 정말로 영향을 줄지는 모르겠지만 Vector를 사용하지 않으면 내장 된 동기화/스레드 안전성이 과도 할 수도 있습니다 –

+0

자바 6에서 원래의 정숙 1.4.2 컴파일 된 코드를 실행 해 보았습니까? 특정 가비지 콜렉터를 선택할 수도 있습니다. 또한 -d32를 사용하여 포인터에 너무 많은 메모리를 사용하지 않도록 할 수 있습니다. –

답변

7

여기에 정보가 많지 않습니다. 그러나 여기 당신이 할 수 있습니다 몇 가지가 탐구 있습니다

  • 는 (귀하의 경우 1024M에서) 동일한 값의 -Xmx 및 XMS와 VM을 시작

  • 서버 JVM의 DLL이되고 있는지 확인 가상 컴퓨터를 시작하는 데 사용됩니다.

  • 실행 프로파일 러는 메모리를 잡아 먹고 또는 어떤 물체가 쓰레기

  • 를 수집하지 않습니다 어떤 객체 볼 수 jconsole을 사용하여 VM을 걸고 객체를 추적

+0

Windows 컴퓨터 ("서버"클래스 컴퓨터 포함)에서는 서버 핫 스폿 VM이 기본적으로 선택되어 있지 않으므로 좋은 팁입니다. – Fortyrunner

3

응용 프로그램에 여유 공간이 거의 부족한 경우 가비지 수집 시간이 계산 시간을 지배 할 수 있습니다.

이를 확인하려면 gc 디버깅을 활성화하십시오. 아니면 jconsole을 시작하여 프로그램에 첨부하기 만하면됩니다.

3

이론적으로는 수 문자열이 내부 char []를 공유하는 방식이 변경되었으므로 애플리케이션이 더 많은 메모리를 소비해야합니다. 1.4 이후에는 공유가 적습니다. (새 블로그 here입니다) http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/5100에 내 옛날 블로그를 확인

나는 메모리 사용량이 정말 문제가 있는지 여부를 확인하기 위해 가비지 콜렉터 로그를 비교하는 것입니다.

이것이 도움이되지 않는다면 차이점을 찾기 위해 Yourkit과 같은 프로파일 러를 사용하십시오.

0

응용 프로그램에서 프로파일 러를 사용하는 것이 좋습니다 (YourKit은 훌륭합니다) ... 대부분의 시간을 프로파일 러에서 신속하게 좁힐 수있을 때 많은 시간을 낭비하기 쉽습니다 .