마지막 업데이트 날짜
2022년 11월 28일
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으로 업그레이드한 후에 다음 설정을 제거해야 합니다.