Java 7의 성능 저하

Java 7에서 AEM의 성능이 갑자기 저하되고, 스레드 덤프에 원인 스레드가 표시되지 않습니다. 많은 스레드가 RUNNABLE 상태에 있으며, 결함이 없는 것으로 알려진 코드 부분을 실행합니다.

이 문제의 근본적인 원인은 Java 7에 이 스택 오버플로우 질문 및 답변에서 설명한 CodeCache 문제가 있기 때문입니다.

즉, "Java 7에서 CodeCache가 꽉 차면 JIT가 중지되고, CodeCache 영역의 거의 1/3이 초기화되지만 JIT가 다시 활성화되지 않습니다."

따라서 코드 캐시에서 제거되었거나 JVM에서 실행된 적이 없는 Java 코드의 실행 속도가 훨씬 느려집니다. 그러므로 JIT 컴파일 코드만 누르는 몇 가지 요청이 일반 응답 시간으로 반응하지만, 다른 요청은 시간이 훨씬 오래 걸립니다.

해결 방법: Java 버전을 업그레이드하거나 코드 캐시의 플러시를 비활성화합니다.

가능한 세 가지 해결 방법이 있습니다.

  • 이 성능 문제의 영향을 받지 않는 Java 8으로 업그레이드합니다. 가장 안전한 해결 방법입니다.
  • Java 1.7.0_101-b14로 업그레이드합니다. Java 7은 2015년 5월 이후 EOL되므로 이 해결 방법은 Oracle의 Java SE 지원이 필요합니다.
  • 코드 캐시의 플러시를 비활성화하고, 다음 JVM 인수를 AEM 시작 스크립트에 추가하여 캐시 크기를 늘립니다. 
    • -XX:-UseCodeCacheFlushing
    • -XX:ReservedCodeCacheSize=90M

이러한 인수는 코드 캐시 크기 90MB(기본값 48MB 대신)를 지정하고 코드 캐시 플러시를 비활성화하므로 코드 캐시가 오버플로우되는 경우 기존 핫 코드가 해석기 모드로 실행되지 않습니다(새 코드만 더 이상 컴파일되지 않음). 일정 기간 동안 코드 캐시 크기를 모니터링하여(예: jconsole 사용) 구성된 최대값이 너무 작지 않은지 확인합니다. Java 8으로 업그레이드한 후에 다음 설정을 제거해야 합니다.

 

이 작업에는 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License의 라이센스가 부여되었습니다.  Twitter™ 및 Facebook 게시물은 Creative Commons 약관을 적용받지 않습니다.

법적 고지 사항   |   온라인 개인 정보 보호 정책