garbage-collection - 为什么 gc() 不释放内存?

  显示原文与译文双语对照的内容
0 0

我模拟运行一个 Windows 64位计算机与 64 GB RAM 。 内存使用达到 55% 和之后完成仿真运行我删除所有工作空间中的对象。 rm(list=ls()),后跟一个 double gc().

我认为,这将释放足够的内存下模拟运行,实际上内存使用删除仅通过1% 。 咨询很多不同的论坛上我找不到令人满意的解释,只有模糊注释如:

" 根据你的操作系统,则释放开内存可能不会返回给操作系统,而是保存在进程空间中。"

我想找到的信息:

  • 1 ) 哪些OS和哪些条件下释放的内存不会返回给OS,
  • 2 ) 是否有其他之外别关闭R 然后再次启动以使下模拟运行?
时间:原作者:6个回答

0 0

怎么检查内存使用情况? 通常虚拟机的分配一些内存块用以存储它的数据。 某些分配可能未使用并标记为空闲。 什么是GC并发现数据未被引用的其他地方和相应的内存块标记为未使用,但这并不意味着这个内存释放到OS 。 仍然从VM透视图现在有更多可用的内存可用于进一步的计算。

按照别人的要求是否遇到内存不足错误? 如果不是那就没什么好担心的

编辑: This应该足以R 中了解内存分配和垃圾收集如何工作。

从第一个文档:

偶尔尝试释放未使用页回操作系统。 释放页面时,许多空闲的节点的数目等于R_MaxKeepFrac时间分配节点的每个类都将保留。 页面不需要为了满足上述的需要被释放为止。 试图释放页就是让每个R_PageReleaseFreq 1 级或2 级集合。

ediT2:

要查看使用的内存再运行gc( ),还会生成详细设置为TRUE :

gc(verbose=T)

这是由于拥有10000000整数在内存中的数组:

Garbage collection 9 = 1+0+8 (level 2) ... 
10.7 Mbytes of cons cells used (49%)
40.6 Mbytes of vectors used (72%)
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  198838 10.7     407500 21.8   350000 18.7
Vcells 5311050 40.6    7421749 56.7  5311504 40.6

这是丢弃后引用它:

Garbage collection 10 = 1+0+9 (level 2) ... 
10.7 Mbytes of cons cells used (49%)
2.4 Mbytes of vectors used (5%)
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 198821 10.7     407500 21.8   350000 18.7
Vcells 310987  2.4    5937399 45.3  5311504 40.6

可以看到使用的内存Vcells想方设法从40 .6Mb 2 .4Mb 。

原作者:
0 0

R垃圾回收机制的不完善,在以下( 不那么) 微妙的差别: 它并不 ( 我如果不包含,则不移动对象 compact 内存) 与其进行交互的方式的影响 C库。 ( 其他languages/implementations也遇到这个问题) 。

这意味着如果轮流使用的内存分配一些小块被丢弃和较大的块有关永久对象( 这是一个常见的情形在进行string/regexp处理),此时你的记忆被分散与垃圾回收器无能为力: 内存被释放,但是不能重新使用,因为空余块太短。

若要解决此问题的唯一方法是将所需对象保存,重新启动 R并重新加载该对象。

既然你在做什么 rm(list=ls()),我如果不包含了,无需任何对象,你无需保存和重新加载任何对象,因此,你而言,该解决方案正是要避免重新启动 R.

原作者:
...