メモリリークとは、プログラムが使用しなくなったメモリを解放せず、メモリが徐々に消費されていく現象を指します。Pythonではガベージコレクションが自動でメモリ管理を行っていますが、特定の状況下ではメモリリークが発生し、以下のような問題を引き起こす可能性があります。
パフォーマンスの低下
クラッシュやフリーズ
リソースの不適切な使用
デバッグの困難
以下は、メモリリークを示す簡単なPythonプログラムの例です。このプログラムでは、リストにオブジェクトを追加し続け、最終的にメモリを消費します。
import tracemalloc
class LeakyClass:
def __init__(self, value):
self.value = value
def create_leak():
leaked_objects = []
for i in range(100000):
leaked_objects.append(LeakyClass(i))
if __name__ == "__main__":
# メモリ使用量の追跡を開始
tracemalloc.start()
# メモリリークを引き起こす可能性のある関数を実行
create_leak()
# メモリ使用量を取得
current, peak = tracemalloc.get_traced_memory()
# メモリ使用量の追跡を終了
tracemalloc.stop()
# 人間が読める形式に変換して出力
current_kb = current / 1024 # 現在のメモリ使用量をKBに変換
peak_mb = peak / 1024 / 1024 # ピーク時のメモリ使用量をMBに変換
print(f"現在のメモリ使用量: {current_kb:.2f} KB")
print(f"ピーク時のメモリ使用量: {peak_mb:.2f} MB")
LeakyClass
は、単純なクラスで、コンストラクタで受け取った値を属性として持ちます。
create_leak:
create_leak
関数では、leaked_objects
リストを作成し、LeakyClass
のインスタンスを100,000個追加しています。これにより、リストがメモリを占有し続け、解放されないため、最終的にメモリリークが発生します。
メイン処理:
if __name__ == "__main__":
ブロックで、create_leak
関数を呼び出し、メモリリークが発生したことを示すメッセージを表示します。このプログラムを実行すると、システムのメモリ使用量が増加し続け、他のプロセスに影響を与える可能性があります。実際にメモリを監視するツールを使うことで、メモリリークの影響を観察することができます。
次のステップでは、メモリリークの検出方法について学びます。