2016-04-12 5 views
1

ここにコードがあります。 main.goでゴランのメモリリーク

func main() { 
    rgc.GetRgcService() 
} 

golangメイン機能では、 rgcmrgc.goという名前の、別のgolangファイルです。内部のコードは

package rgc 
func GetRgcService() (svc *RgcService, err error) {} 

です。関数GetRgcServiceは空の関数です。私はメモリをテストするためにvalgrindを使用する場合

はしかし、私はどのように私はこれらのメモリを解放することができ、次の出力

==58156== HEAP SUMMARY: 
==58156==  in use at exit: 1,152 bytes in 4 blocks 
==58156== total heap usage: 9 allocs, 5 frees, 1,304 bytes allocated 
==58156== 288 bytes in 1 blocks are possibly lost in loss record 4 of 4 
==58156== at 0x4A27F63: calloc (vg_replace_malloc.c:593) 
==58156== by 0x4010DE1: allocate_dtv (in /home/opt/gcc-4.8.2.bpkg-r2/gcc-4.8.2.bpkg-r2/lib64/ld-2.18.so) 
==58156== by 0x40114ED: _dl_allocate_tls (in /home/opt/gcc-4.8.2.bpkg-r2/gcc-4.8.2.bpkg-r2/lib64/ld-2.18.so) 
==58156== by 0x4B36DE2: [email protected]@GLIBC_2.2.5 (in /home/opt/gcc-4.8.2.bpkg-r2/gcc-4.8.2.bpkg-r2/lib64/libpthread-2.18.so) 
==58156== by 0x4B2937: _cgo_sys_thread_start (gcc_linux_amd64.c:75) 
==58156== by 0x45506C: runtime.asmcgocall (/home/map/.jumbo/lib/go/src/runtime/asm_amd64.s:612) 
==58156== by 0x50619F: ??? (in /home/users/zhanghuaizhi/ttt.38) 
==58156== by 0xC7FFFFFFFF: ??? 
==58156== by 0xC820067FFF: ??? 
==58156== by 0x42D69B: runtime.allocm (/home/map/.jumbo/lib/go/src/runtime/proc.go:1260) 
==58156== by 0x42DD3A: runtime.newm (/home/map/.jumbo/lib/go/src/runtime/proc.go:1510) 
==58156== by 0x42E071: runtime.startm (/home/map/.jumbo/lib/go/src/runtime/proc.go:1583) 
==58156== 
==58156== LEAK SUMMARY: 
==58156== definitely lost: 0 bytes in 0 blocks 
==58156== indirectly lost: 0 bytes in 0 blocks 
==58156==  possibly lost: 1,152 bytes in 4 blocks 
==58156== still reachable: 0 bytes in 0 blocks 
==58156==   suppressed: 0 bytes in 0 blocks 

を得ましたか。私は多くの処理を行うためにこの関数を使う必要があるからです。多くのメモリリークが発生するため、解放できません。

+4

Goはメモリ管理とガベージコレクションであるため、手動でメモリを解放する方法はありません。そのため、私はvalgrindを使ってGoアプリを調べることが有用であるかどうかはわかりません。 –

+0

@Not_a_Golfer 'valgrind'は強力なメモリテストツールです。あなたは試してみることができます – Wyatt

+6

@Wyatt彼のポイントは、valgrindはGoプログラムでは役に立たないということです。 Goがどのようにメモリを管理しているかはわかりません。 Goはmalloc/freeを使用しません(ここでは、標準ライブラリを使用する必要があるまれなケースを除いて)。これはvalgrindがメモリ割り当てについて知るべきオーバーライドです。 – Art

答えて

13

何も漏れませんでした。メモリはまだ到達可能であり、終了時に解放しないことは非常に一般的です。ただ不必要な時間がかかり、OSはそれをどうにか処理します。

これは、実行中のスレッドにスレッドローカルストレージを割り当てるために割り当てられたメモリなので、解放するのは間違いです。より良い質問は、「どのように私はこのスレッドを止めるのですか?」という答えです。あなたはそうではありません.Goランタイムはそれを扱います。終了時にスレッドを止めないのはよくあることですが、不必要な時間がかかってしまい、OSはそれに対処します。

これは、あなたのコードと関数呼び出しとは関係がありません。Goランタイムがそれ自身で割り当てるものです。

ゴーはガベージコレクション言語で、valgrindを使用するとそれほど多くは分かりません。実際のメモリリークを検出することも、使用されているメモリがまだわからないこともありません。

0

手動でガベージコレクションを実行することができます:私はそれがメモリを解放すると思いますが、他の人が言ってきたように、実行時の予定のガベージコレクタの実行時に、そのメモリが最終的に解放されます https://golang.org/pkg/runtime/#GC

を。