programing

Tomcat에서 배포되지 않은 메모리 누수를 방지할 수 있는 방법이 있습니까?

sourcejob 2023. 8. 22. 22:05
반응형

Tomcat에서 배포되지 않은 메모리 누수를 방지할 수 있는 방법이 있습니까?

이 질문은 Tomcat 관리자에서 "누출물 찾기" 버튼을 테스트하여 다음과 같은 결과를 얻은 사람을 대상으로 합니다.

다음 웹 응용 프로그램이 중지(재로드, 배포 취소)되었지만 이전 실행의 클래스는 여전히 메모리에 로드되므로 메모리 누수가 발생합니다(프로파일러를 사용하여 확인).
/sysy-app-name

저는 이것이 빈번한 재배치에서 자주 발생하는 "Perm Gen space" 오류와 관련이 있다고 생각합니다.

배포할 때 jconsole에서 확인할 수 있는 것은 로드된 클래스가 약 2k에서 5k로 증가한다는 것입니다.그러면 배포 취소 시 다시 2k로 떨어져야 한다고 생각하겠지만 5k로 유지됩니다.

다음과 같은 JVM 옵션도 사용해 보았습니다.

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled

사용된 Perm Gen 공간의 양이 매우 약간 감소하는 것을 보았지만 예상했던 것은 아니었고 로드된 클래스 수는 감소하지 않았습니다.

그래서 Tomcat을 구성하거나 배포 취소 시 앱을 더 잘 언로드할 수 있도록 설계할 수 있는 방법이 있습니까?아니면 몇 가지 주요 디버깅 세션 후에 서버를 다시 시작해야 합니까?

Tomcat 버전 출력:

서버 버전:Apache Tomcat/6.0.29
서버 구축:2010년 7월 19일 1458
서버 번호: 6.0.0.29
OS 이름:윈도우 7
OS 버전: 6.1
아키텍처: x86
JVM 버전: 1.6.0_18-b07
JVM 공급업체:썬 마이크로시스템즈 주식회사

업데이트:

셀리아스의 답변 덕분에 저는 조금 더 발굴하기로 결정했고 CXF, 스프링, JAXB 덕분에 범인이 제 지원서에 있다고 판단한 것 같습니다.

Java 애플리케이션을 프로파일링하는 방법을 배운 후 Tomcat에서 프로파일러를 가리키고 메모리에 있는 개체와 클래스가 어떻게 생겼는지 보기 위해 힙 덤프와 스냅샷을 만들었습니다.CXF/JAXB(wsdl2java)에서 생성된 클래스에 사용된 XML 스키마의 열거 중 일부가 배포 취소 후에도 남아 있습니다.내 힙 덤프에 따르면 물체가 지도에 묶여 있는 것처럼 보입니다.고지 사항:Java에서 개체의 호출 트리를 프로파일링하고 추적하는 것이 아직 미숙하다는 것을 인정합니다.

또한 서비스를 호출하지도 않고 배포한 후 배포를 취소했습니다.배치 시 스프링에서 시작된 반사를 통해 물체 자체가 로드되는 것처럼 보였습니다.저는 봄에 CXF 서비스를 설정하는 관례를 따랐다고 생각합니다.그래서 나는 이것이 스프링/CXF, JAXB, 또는 반사의 잘못인지 100% 확신할 수 없습니다.

참고로 문제의 애플리케이션은 Spring/CXF를 사용하는 웹 서비스이며 XML은 다소 복잡한 스키마(NIEM의 확장)입니다.

누출이 발생하지 않도록 하려면 다음을 수행해야 합니다.

  • 웹 응용 프로그램이 웹 컨테이너 공유 라이브러리에 있는 Java 클래스를 사용하지 않는지 확인합니다.공유 라이브러리가 있는 경우 해당 라이브러리의 개체에 대한 강력한 참조가 없는지 확인합니다.
  • 특히 HashTable, Sets 등과 같은 Java 개체에서는 정적 변수를 사용하지 않도록 합니다.필요한 경우 제거를 호출하여 맵, 목록...과 함께 개체를 해제해야 합니다.

ThreadLocal 및 MemoryLeaks에 대한 좋은 기사도 있습니다. - http://blog.arendsen.net/index.php/2005/02/22/threadlocals-and-memory-leaks-revisited/

Tomcat 7은 이 분야에서 개선을 가져올 것으로 예상됩니다.Apache Tomcat 7의 기능, "누출 없음!" 섹션을 참조하십시오.

그들은 이제 웹 애플리케이션으로 인한 많은 메모리 유출에 대처할 수 있다고 믿습니다.안타깝게도 아직 베타 버전입니다.

그 외에는 저도 같은 경험을 했고 해결책을 찾지 못했다고만 말할 수 있습니다.배포하려면 일반적으로 나중에 Tomcat을 다시 시작해야 합니다.저는 범인이 누구인지 전혀 모릅니다: 제 웹 애플리케이션, Tomcat, Hibernate, Tapestry 또는 그들 중 몇 명입니다.

언급URL : https://stackoverflow.com/questions/4565105/is-there-a-way-to-avoid-undeployment-memory-leaks-in-tomcat

반응형