2014-06-20 2 views
2

제가 아파치 드리프트를 사용하여 자바 서버를 실행하고 항상 성장 I 메모리 (올드 세대를) 발견을 프로파일 링하고있어 실행 누출 그래프를 끝내면 "Perform GC"를 클릭했기 때문입니다.메모리, 아파치 드리프트 서버

여기에 메모리 누수가 있음을 알고 있습니다. 그래서 누출 감지기 (MAT)를 실행하고 다음과 같이보고 "에 의해로드"com.sun.jmx.remote.internal.ArrayNotificationBuffer " 의

MAT report

하나의 인스턴스를"(7844208를 차지 77.22 %) 바이트.

나는이 클래스를 직접 사용하지 않으므로 Apache Thrift가이를 내부적으로 사용한다고 가정합니다. 나는 또한 ArrayNotificationBuffer 메모리 누수가 발견했습니다 this actually is an old known fixed JDK bug.

그래서 나는 이것에 대해 몇 가지 질문이 있습니다

  1. 내가 클릭 "GC 수행"왜 할당 된 메모리 이러한 드롭이있다? GC가 자동으로 실행되지 않습니까? 왜이 메모리를 쓰레기 수집하지 않는거야? ArrayNotificationBuffer에 관한

  2. 내가 사용하는 오픈 JDK (7u55-2.4.7-1ubuntu1 ~ 0.12.04.2) 및 as far as I can see 모든 버그는 매우 오래된 고정, 그래서 왜 이런 일이 무엇입니까? 그것을 고치는 방법?

+0

빠른 검색은 Thrift 소스에 'ArrayNotificationBuffer'가 없음을 나타냅니다. – JensG

+0

@JensG 내가 틀렸다고 생각한다. JMX는 실제로 JVM에서 실제로 사용된다. – m0skit0

답변

1

GC()를 실행할 때 할당이 지워 졌다는 사실은 결국 발표 될 합법적 인 메모리 덩어리를 의미합니다. 힙이 크고 다른 할당 요청이 실패하지 않으면 오래된 세대는 잠시 동안 지연 될 수 있습니다.

버퍼에 관해서는, JMX 알림 수신기가 등록되었지만 적시에 방출 알림을 처리하지 못한다고 추측하지만, 말하기는 어렵습니다.

+0

좋아, 나는 오래된 유전자가 지연 될 수 있지만 거의 2 일간 지연 될 수 있다는 것을 알고있다? 무엇 때문에? 쓸모없는 객체는 무엇입니까? 어떤 생각을 JMX 유출을 고치는 방법? – m0skit0

+0

심각하게 리소스가 제한된 환경을 사용하지 않는 한 70MB짜리 오래된 세대가 상당히 평범한 사람입니다. [서버] JVM의 기본 힙 공간은 일반적으로 1GB 영역에 있으므로 이것이 비정상적인 상태라고 생각하지 않습니다. – Nicholas

+0

예, 맞습니다. 힙은 1 GiB입니다. 좋아, 알았다. JMX는 어떨까? 제 생각에는 JMX가 Thrift가 아닌 JVM입니다.하지만이 기능을 구성하거나 해제하는 방법을 모르겠습니다. – m0skit0