Introduction
System.Drawing
の代替の有力候補、というか Microsoft が推奨している SkiaSharp
。
それを使っている過程でとんでもないメモリーリークが。
それも、ビットマップのインスタンス複製、というよくあるケースで。
Why?
複製したインスタンスを Dispose
しているにも関わらず、メモリが解放されない。
下記が再現コード。
1 | using System.Runtime.CompilerServices; |
こちらは安全にコピーできるコード。
1 | using System.Runtime.CompilerServices; |
上記の出力結果である csv を整理し、前者を Copy、後者を Unsafe としたのが下記のグラフ。
- X 軸は ループ回数
- Y 軸は メモリ (WorkingSet、単位は MB)
GC は自動で行われているが、それでも 12 GB まで増えてから走るのはシステムに相当な影響を与えそうなのは想像に難くない。
類似バグは上がっている。
- [BUG] Memory leak when create and dispose SKBitmap and SKCanvas using SkiaSharp #1009
- [BUG] SKBitmap.CopyTo leaking memory? #2527
が、どれも的外れな気がする。
とりあえず、インスタンスの複製は、Unsafe を駆使した方法が無難に思える。