首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么performGC无法释放所有内存?

为什么performGC无法释放所有内存?
EN

Stack Overflow用户
提问于 2011-06-13 02:12:15
回答 1查看 2K关注 0票数 19

给定程序:

import Language.Haskell.Exts.Annotated -- from haskell-src-exts
import System.Mem
import System.IO
import Control.Exception

main :: IO ()
main = do
  evaluate $ length $ show $ fromParseResult $ parseFileContents $ "data C = C {a :: F {- " ++ replicate 400000 'd' ++ " -}     }"
  performGC
  performGC
  performGC

使用GHC 7.0.3,当我运行:

$ ghc --make Temp.hs -rtsopts && Temp.exe +RTS -G1 -S
    Alloc    Copied     Live    GC    GC     TOT     TOT  Page Flts
    bytes     bytes     bytes  user  elap    user    elap
 ...
 29463264        64   8380480  0.00  0.00    0.64    0.85    0    0  (Gen:  0)
       20        56   8380472  0.00  0.00    0.64    0.86    0    0  (Gen:  0)
        0        56   8380472  0.00  0.00    0.64    0.87    0    0  (Gen:  0)
    42256       780     33452  0.00  0.00    0.64    0.88    0    0  (Gen:  0)
        0                      0.00  0.00

performGC调用似乎留下了8Mb的内存,即使看起来所有的内存都应该是死的。怎么会这样?

(如果没有-G1,我会看到10Mb的最终版本,我也无法解释这一点。)

EN

回答 1

Stack Overflow用户

发布于 2011-06-13 03:47:19

使用-O -ddump-simpl编译代码时,我在简化程序输出中看到了以下全局定义:

lvl2_r12F :: [GHC.Types.Char]
[GblId]
lvl2_r12F =
  GHC.Base.unpackAppendCString# "data C = C {a :: F {- " lvl1_r12D

解析器函数的输入已成为全局字符串常量。全局变量在GHC中永远不会被垃圾回收,所以这可能就是垃圾回收后占用8MB内存的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6323641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档