메모리의 개체 수를 줄이려고합니다. 동일한 값을 가진 많은 객체가있을 수 있습니다. 힙 덤프에 같은 값을 가진 모든 개체를 찾는 방법이 있습니까?힙 덤프에서 같은 값을 가진 개체 찾기
답변
프로파일 러를 사용하십시오. YourKit에이 기능이 있다고 말할 수 있습니다.
메모리의 개체 수를 줄이려고합니다. 동일한 값을 가진 많은 객체가있을 수 있습니다.
장기적인 목표는 응용 프로그램에 동일한 값을 가진 개체 복사본을 하나만 유지함으로써 메모리를 절약하는 것이라고 가정합니다.
이 아이디어의 문제점은 일반적으로 동일한 값을 가진 이전 개체를 찾을 수 있도록 여분의 데이터 구조를 작성/유지해야한다는 것입니다. 예 : HashMap. (구아바 인내 같은 선반 솔루션은 꺼져 있습니다.) 조심하지 않으면이 데이터 구조가 중복을 제거하여 저장하는 것보다 더 많은 메모리를 사용할 수 있습니다.
또한 제대로 구현되지 않았으므로 "interning"데이터 구조가 개체가 가비지 수집되지 않도록 효과적으로 메모리를 누출시킬 수 있습니다. 메모리 누출 문제에 대한 해결책은 모두 WeakReferences 등을 사용하는 것과 관련이 있습니다. 즉, 더 많은 개체와 더 느린 가비지 수집을 의미합니다. 후자는 1) 내부 개체를 GC로 추적 할 필요가 있고, 2) 내부 개체가 오래 생존하는 경향이 있고 구세대에 끝날 가능성이 높고 3) WeakReference 인스턴스가 GC에 비해 상대적으로 비싸기 때문입니다 다루기 위해서.
요약하면 메모리 문제를 악화시키지 않도록주의하십시오!
Integer.valueOf(int i)
메서드에 대한 Sun/Oracle Java 구현을 살펴보십시오. 이미 인기 값 (-128에서 127까지)의 사전 결정된 캐시가 있으므로 해당 값에 대해 해당 메소드를 호출 할 때 새 인스턴스가 작성되지 않습니다.
이렇게하면 개체를 만드는 데주의를 기울이면 메모리 발자국을 줄일 수 있습니다. 아마도 객체가 어떻게 생성되는지 조사하고 생성시 객체를 캐시하려고 시도해야합니다. 아마도 대중적인 유스 케이스를 보거나 애플리케이션이 작동하는 방식을 프로파일 링하는 것일 수도있다. 이것은 응용 프로그램에 따라 달라질 수 있으며, 즉시 사용할 수있는 솔루션이 있을지는 의문입니다. 나는 이것이 현재 당신에게 너무 많은 공간을 차지하고있는 것을 해결하기보다는 오히려 장기적으로 당신에게 어떤 노력을 덜어 줄 것이라고 믿습니다.
나는 그들의 웹 사이트에서 문자열과 배열 (전용)을 텍스트 검색 기능으로 만 기억할 수는 없다. 이 기능을 올바로 이해하면 내부 기능이 프로파일 러와 통합되는 것에 의존하게됩니다. – finnw