0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

メモリ管理の基本

スタック (Stack)

  • 関数呼び出しやローカル変数の保存に使われる領域
  • 高速にアクセスでき、関数のスコープが終了すると自動で解放される

ヒープ (Heap)

  • 長期間保持されるデータや動的に割り当てられるメモリに使われる領域
  • 手動または自動で解放する必要がある

ガベージコレクション

ガベージコレクション (GC) とは、プログラムが不要になったメモリ領域(ヒープ)を自動で解放する仕組みです。これにより、メモリリークを防ぎ、効率的なメモリ利用を実現します。

メリット:

  • 開発者が手動でメモリ解放を行う必要がないため、コードの安全性と可読性が向上
  • メモリリークの発生を防ぎやすい

デメリット:

  • GCの実行中にわずかなパフォーマンス低下が発生する可能性がある
  • 高負荷なリアルタイムシステムでは、GCがボトルネックになる場合がある

Goでのメモリ管理とGCの確認

package main

import (
	"fmt"
	"runtime"
)

func main() {
	// メモリ使用量を表示する関数
	printMemStats := func() {
		var m runtime.MemStats
		runtime.ReadMemStats(&m)
		fmt.Printf("メモリ使用量: Alloc = %v KB\n", m.Alloc/1024)
		fmt.Printf("GCの回数: NumGC = %v\n", m.NumGC)
		fmt.Println("-------------------------------")
	}

	// メモリ使用量を初期表示
	fmt.Println("初期状態:")
	printMemStats()

	// ヒープメモリを割り当てる
	fmt.Println("メモリを割り当て:")
	slice := make([]byte, 1024*1024)
	for i := range slice {
		slice[i] = byte(i % 256)
	}
	printMemStats()

	// ガベージコレクションを強制的に実行
	fmt.Println("GCを強制的に実行:")
	runtime.GC()
	printMemStats()
}
初期状態:
メモリ使用量: Alloc = 64 KB
GCの回数: NumGC = 0
-------------------------------
メモリを割り当て:
メモリ使用量: Alloc = 1088 KB
GCの回数: NumGC = 0
-------------------------------
GCを強制的に実行:
メモリ使用量: Alloc = 63 KB
GCの回数: NumGC = 1
-------------------------------
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?