2009-09-18 3 views
11

메모리 조정이 필요한이 webapp가 있습니다. 이미 애플리케이션 자체를 프로파일 링하고 일들을 트리밍하는 동안 JVM 자체가 가장 바쁜 순간에 나에게 너무 부풀어 오른 것처럼 보입니다. (낮은 볼륨의 경우이 문제가되지 않습니다.) 자세한 :-d64 스위치는 Sun JVM 상주 메모리 사용에 어떤 영향을 미칩니 까?

  • 플랫폼 :
    • RHEL4 64 비트 (Linux 2.6.9-78.0.5.ELsmp #1 SMP x86_64)
    • 썬 자바 6 (Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode))
    • 톰캣 6 -d64 in startup.sh
  • 현재 webapp에는 제작시 이점이 필요한 몇 가지 코드가 있습니다. 64 비트 실행.
  • 몇 시간 (1 주일) 후에 JVM의 상주 메모리 크기 (위 그림과 같이)가 세 번 -Xmx 설정 크기임을 알았습니다. 등
  • 비 힙 메모리의 크기는 모든 힙 크기의 단순한 단일 숫자의 비율이 64 비트 비트 주소 공간을 필요로 코드의 한 부분
  • 있다
  • , 상대적으로 사소한

내가 64 비트 JVM에 대한 필요성을 리팩토링하고 -d64 스위치를 놓을 수 있다면 JVM의 상주 메모리 공간을 더 작게 만들 수 있을까요? 다른 말로하면 ...

-d64 스위치는 Sun JVM 상주 메모리 사용에 어떤 영향을 미칩니 까?

답변

18

d64 스위치를 사용하면 JVM이 64 비트 모드로 전환됩니다. 기술적으로, 솔라리스/리눅스와 대부분의 Unix에서 JVM 프로세스는 LP64 모델에서 실행됩니다.

LP64 model은 포인터가 32 비트 포인터와 달리 64 비트 폭이된다는 점에서 32 비트 모델 (ILP32)과 다릅니다. JVM의 경우이 기능을 사용하면 더 많은 메모리 주소 지정 기능을 사용할 수 있지만 개체 참조가 차지하는 크기 만 두 배가된다는 의미이기도합니다. 따라서 32 비트 JVM 및 64 비트 객체에서 주어진 시간에 같은 수의 객체에 대해 더 큰 팽창이 있습니다.

종종 잊혀지는 또 다른 사항은 지침 자체의 크기입니다. 64 비트 JVM에서 명령어의 크기는 기본 머신 레지스터 크기를 차지합니다.

그러나 64 비트 환경에서 compressed object pointers을 사용하는 경우 JVM은 가능한 한 4GB 이상의 힙 크기에 대해 포인터를 인코딩하고 디코딩합니다. 간단히 말하면, 압축 포인터를 사용하면 JVM은 가능한 32 비트 폭 값을 사용하려고 시도합니다.

힌트 : -XX : UseCompressedOops을 사용하여 UseCompressedOops 플래그를 켜서 일부 확장을 제거하십시오. YMMV,하지만 people have reported upto 50% drop in memory bloat by using compressed oops.

편집

The UseCompressedOops flag is supported in version 14.0 of the Java HotSpot VM, available from Java 6 Update 14 onwards.

+0

환상적인 답변. 당신은 내 코드를 리팩터링하고, -d64를 드롭하도록 확신했다. 나는 어떻게 돌아가는지에 대해 논평 할 것이다.또한 -XX : + UseCompressedOops를 시도 할 수 있도록 JVM 업데이트에서 작업 할 것입니다. 감사. 2009 년 9 월 * Stu의 세계적으로 유명한 "이달의 최고의 코더"* 상을 수상했습니다! –

+0

와우, 나는 어떤 google-fu가 그런 반응을 명료하게 알지는 못했다. 고마워, 나는 너의 대답에 놀랐다! Btw, 힙을 4GB보다 작게 유지하면 64 비트 JVM은 32 비트처럼 동작합니다. 성능에 미치는 영향에 대해서는 확실하지 않습니다. –

+0

Google-fo 이상! 나는 내 자신을 둘러 보았고, 노력할만한 가치가 있다고 생각했다.하지만, 많은 JVM 스위치와 값, if-then-but, 그리고 gotchyas가있다. 그것은 압도적 인 것일 수 있으며, 나의 필요는 관련 스푼 먹이를 동반 한 * "대답"*/* "대답"* 해답이었습니다. 다시 한번 감사드립니다. –