2012-05-09 17 views
10

ライブラリドキュメントではで作成したCStringfree関数で解放する必要があります。私はCStringが作成されるといくらかのメモリが必要になると予想しており、freeのメモリ使用量がリリースされると、メモリ使用量は減少しますが、それはありませんでした!ここでのコード例である:プログラム(1)は、htopプログラムは、メモリ使用量が410Mの周りのどこかであることを示した時に停止newCStringで割り当てられたメモリを解放する

module Main where 

import Foreign 
import Foreign.C.String 
import System.IO 

wait = do 
    putStr "Press enter" >> hFlush stdout 
    _ <- getLine 
    return() 

main = do 
    let s = concat $ replicate 1000000 ['0'..'9'] 
    cs <- newCString s 
    cs `seq` wait -- (1) 

    free cs 
    wait -- (2) 

- これはOKです。私はenterを押して、プログラムは行(2)で停止しますが、csfree dでしたが、メモリ使用量はまだ410Mです!

これはどのように可能ですか? Cで書かれた同様のプログラムは、必要なように動作します。私はここで何が欠けていますか?

+1

あなたが使用しているGHCのバージョン? OSにメモリを返す機能は、昨年GHCに追加されました。 –

+0

'ghc --version'は' The Glorious Glasgow Haskell Compilation System、version 7.4.1'を出力します。 –

答えて

8

問題は、freeは、ガベージコレクタに文字列を収集できることを示しているということです。実際にガベージコレクタを強制的に実行させるわけではありません.CStringが現在ゴミになっていることを示しています。ヒープ圧力ヒューリスティックに基づいて、いつ実行するかを決定するのはGCまでです。

あなたはまっすぐすぐ5Mにメモリを減らすか、そうfreeに呼び出し、後performGCを呼び出すことによってメジャーコレクションすることができます。

など。このプログラム:以下のメモリプロファイルと、予想通り

import Foreign 
import Foreign.C.String 
import System.IO 
import System.Mem 

wait = do 
    putStr "Press enter" >> hFlush stdout 
    _ <- getLine 
    return() 

main = do 
    let s = concat $ replicate 1000000 ['0'..'9'] 
    cs <- newCString s 
    cs `seq` wait -- (1) 

    free cs 
    performGC 
    wait -- (2) 

振る舞いは - 最初の赤い点はすぐに文字列を割り当て解除、performGCへの呼び出しです。その後、プログラムは終了するまで約5Mの速度で移動します。

enter image description here

+0

ありがとうございました。私はこの方法でghcの作業で 'malloc' /' free'を知りませんでした。私は 'performGC'を試してみました。さて、この質問は、特定のCライブラリへのバインディングがどれほどうまく動作しているかをテストしていたときに発生しました。私は大量のC文字列でそれらをテストし、メモリが解放されていないことを知って驚いた。この謎は今解決されたようです) –

+2

「performGC」は本当にうまくいくというあなたの証拠を議論することはできないと思いますが、これは私が行って、[source](http:// hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/src/Foreign-Marshal-Alloc.html#free) - 'free'は本当にC関数を' free 'と呼びます) '。それはGCとどのように相互作用しますか? –

+2

GCが実行されるまで、GHC rtsプールから実際にOSにメモリが解放されないからです。だから、あなたはハスケルからのメモリブロックを再利用することができるでしょう、それはまだOSに返されません。 –

関連する問題