힙 프로필에 내 코드는 활성 메모리를 보여줍니다 , 기억 t 그는 런타임이 가비지 컬렉터에 의해 수집되지 않았 음을 의미합니다. GC가 메모리를 수집 할 때 프로필은 축소되지만 메모리는 시스템에 반환되지 않습니다. 장래의 할당은 시스템에 더 많은 것을 요구하기 전에 이전에 수집 된 오브젝트 풀에서 메모리를 사용하려고합니다.
외부에서 보면 프로그램의 메모리 사용량이 증가하거나 계속 유지된다는 의미입니다. 외부 시스템이 프로그램의 "Resident Size"로 표시하는 것은 사용중인 go 값이나 수집 된 값을 보유하고 있는지 여부에 관계없이 프로그램에 할당 된 RAM의 바이트 수입니다. 때문에
이 두 숫자는 종종 매우 다른 이유는 다음과 같습니다
- GC의 수집 메모리가 프로그램의 외부보기에 아무런 영향을 미치지 않습니다
- 메모리 단편화는
- GC의는 경우에만 실행 사용중인 메모리가 이전 GC 이후의 메모리를 두 배로 만듭니다 (기본값 : http://golang.org/pkg/runtime/#pkg-overview 참조)
이동 방법에 대한 정확한 분석을 원한다면 당신이 메모리를 사용할 수 s를 runtime.ReadMemStats 호출 : http://golang.org/pkg/runtime/#ReadMemStats
을 양자 택일로, 당신은 귀하의 브라우저를 통해 프로파일 데이터에 액세스 할 수있는 경우에 당신이 웹 기반의 프로파일 링을 사용하고 있기 때문에 : http://10.10.58.118:8601/debug/pprof/
힙 링크를 클릭하면 디버깅을 보여줍니다 런타임에 런타임 .MemStats 구조의 인쇄물이있는 힙 프로파일의보기.
런타임.MemStats 문서 (http://golang.org/pkg/runtime/#MemStats는) 모든 필드의 설명을 가지고 있지만,이 논의에 대한 흥미로운 사람은 다음과 같습니다
- 를 HeapAlloc : 기본적으로 어떤 프로파일 러 (활성 힙 메모리) 당신에게
- ALLOC주고있다 :를 HeapAlloc과 유사한를 하지만, 모든 이동 관리되는 메모리
- sys 인에 대한 : 메모리 (주소 공간)의 총량 OS에서 요청
이동이 요구하시는 것 때문에 여전히 sys 인 사이의 불일치, 그리고 무엇 OS의보고가 될 것입니다 시스템, 운영체제 g 항상 동일하지는 않습니다. 또한 CGO/syscall (예 : malloc/mmap) 메모리는 이동에 의해 추적되지 않습니다.
포스트 코드를 참조하십시오. 귀하의 프로그램이하는 것을 저희에게 알려주십시오. – elithrar
GC 때문에 어쩌면? http://dave.cheney.net/2014/07/11/visualising-the-go-garbage-collector가 도움이 될 수 있습니다. – VonC
remaning memory가 garbaged로 수집되지 않고 시스템에 릴리스 된 것처럼 보입니다. 몇 분 동안 사용하지 않으면 완료됩니다. 8 분을 기다렸다가 다시 확인하십시오. Go 프로그램을 디버깅/프로파일 링하는 방법에 대한 안내는이 링크에서 확인하십시오. https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs – siritinga