ВведениеКак я могу сделать освобождение памяти GHCI
Следующий код показывает, что при использовании runhaskell
Haskell сборщик мусора освобождает память, когда a
больше не используется. Это приводит к дампу ядра, освобождая переменную a
- для целей проверки поведения - a
получил nullFunPtr
в качестве финализатора.
module Main where
import Foreign.Ptr
import Foreign.ForeignPtr
main :: IO()
main = do
a <- newForeignPtr nullFunPtr nullPtr
putStrLn "Hello World"
Проблема
При работе то же самое в GHCI это не освобождает память. Как заставить ghci освобождать больше не используемые переменные?
$ ghci
> import Foreign.Ptr
> import Foreign.ForeignPtr
> import System.Mem
> a <- newForeignPtr nullFunPtr nullPtr
> a <- return() -- rebinding variable a to show gc that I'm no longer using it
> performGC
> -- did not crash - GC didn't release memory
> ^D
Leaving GHCi.
[1] 4396 segmentation fault (core dumped) ghci
Память была выпущена при выходе, но это слишком поздно для меня. Я расширяю GHCi и использую его для других целей, и мне нужно освободить память раньше - по требованию или как можно быстрее, было бы действительно здорово.
Я знаю, что могу позвонить finalizeForeignPtr
, но я использую foreignPtr
только для целей отладки. Как я могу выслать a
вообще в последнем примере?
Если у вас нет возможности сделать это с помощью ghci prompt, я также могу изменить код ghci
. Может быть, я могу освободить этот a
от modyfing ghci Interactive Context или DynFlags? До сих пор мне не повезло с моим reaserch.
Вы уверены, что память не была выпущена? Я не думаю, что есть гарантия, что финализаторы работают быстро, когда переменная GC'd. –
Скорее да, я делал подобные тесты с большими массивами и контролировал его с помощью 'ekg'. Ничего не было выпущено. – remdezx
Зачем должен быть '' 'мусор, собранный после переназначения на'() '? Как может ghci знать (из-за своего рода монашон IO), он не понадобится? –