我应该怎么做才能让GC释放OCaml中未使用的内存?

杰克逊故事

我正在为mergesort和quicksort制定基准。

我实施了Random_list.createMergesort.sort_list并且Quicksort.sort_list我们可以假定这三个功能已正确实现,并且实现在此问题中并不重要。

我想问的是OCaml的GC


这是我的基准代码:

let _ = 
  let l = Random_list.create 10000000 in

  let len1 = List.length (Mergesort.sort_list l) in
  Printf.printf "mergesort done for %d elements" len1;

  let len2 = List.length (Quicksort.sort_list l) in
  Printf.printf "quicksort done for %d elements" len2

如果我运行上面的代码,它将Fatal error: exception Out_of_memory在之后告诉我mergesort done for 10000000 elements

它内存不足,没问题。输出也告诉我Out_of_memory成功后发生了mergesort


然后,我所做的是拆分代码并分别进行测试:

let _ = 
      let l = Random_list.create 10000000 in
      let len1 = List.length (Mergesort.sort_list l) in
      Printf.printf "mergesort done for %d elements" len1

接着

let _ = 
      let l = Random_list.create 10000000 in
      let len2 = List.length (Quicksort.sort_list l) in
      Printf.printf "quicksort done for %d elements" len2

没有 两者都可以正常运行Out_of_memory


这是我的问题:

根据我的基准代码,是的,我进行了串行排序:mergesort,然后是quicksort。

在执行过程中,应该创建3个主要列表:l并列列表来自mergesort和quicksort。

但是,从mergesort创建的列表应该GCedquicksort之前,对吗?而且该列表没有任何引用,对不对?

在进行快速排序之前,只有一个主要清单是原始清单l,对吗?

为什么它仍然给出Out_of_memory错误?

克里斯托弗·莱克

我认为问题在于您使用的列表非常大。垃圾收集器保留两个不同的堆来管理内存:

  • 一个较小的堆用于微型/短命的对象。
  • 一个主要的堆长期持久的对象。

次要堆会定期清除,如果对象的生存期足够长,则会将其提升为主要堆。

但是,真正的大对象会直接进入主堆。问题在于,大型堆需要停止运行,即停止应用程序。因此,主要堆收集分几个步骤完成,以确保应用程序不会长时间停止,并且也不会像次要堆收集那样频繁地完成。

在您的情况下,也许在您开始快速排序时仍未收集merge_sort列表,因此所有3个列表都同时存在于内存中。

您可以要求GC进行完整的主要收集,以查看它是否可以解决问题:

let _ = 
  let l = Random_list.create 10000000 in

  let len1 = List.length (Mergesort.sort_list l) in
  Printf.printf "mergesort done for %d elements" len1;

  Gc.full_major ();

  let len2 = List.length (Quicksort.sort_list l) in
  Printf.printf "quicksort done for %d elements" len2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该怎么做才能让新小部件始终落后于 kivy 中的旧小部件?

我应该怎么做才能让我的盒子水平对齐?

我应该怎么做才能让android studio检测设备

我该怎么做才能让这个函数输出?

我该怎么做才能让 MD 文件在 Notepad++ 中更明显?

我应该怎么做才能优化我的慢跑性能?

我应该怎么做才能使用 express-jwt 访问我的静态资源?

我应该怎么做才能使我的容器使用范围?

我应该怎么做才能避免服务层方法中的代码重复?

我应该怎么做才能在WebStorm的.ts文件中解析“角度”

我应该怎么做才能在 django rest 框架中的代码中发布多个内容?

我应该怎么做才能在WebAPI中返回一对多列表?

我应该怎么做才能将数据从json插入到sqlite在Android中

我应该怎么做才能在php中获得像这样的数组?

Java数组我应该怎么做才能从数组中读取并显示

我应该怎么做才能在Java中使用ELement类

我该怎么做才能让 MDB 最后部署在我的野蝇上

我该怎么做才能让我的系统更耐受断电?

我的JSP页面未添加数据库中的数据。我应该怎么做才能改善这一点?

即使未打开应用程序,我应该怎么做才能使 firebase 数据库同步

我应该怎么做才能显示 2 个或更多不同表中的所有数据,我尝试使用 JOIN 但我仍然不明白?

我该怎么做才能让一个按钮被切换,其他按钮保持未切换(学习 dom 操作)

我应该怎么做才能使用 boto3 修复“您提供的 AWS 访问密钥 ID 在我们的记录中不存在”

我应该怎么做才能从上一次推送的提交中获取源代码?

我应该怎么做才能将程序排除在读取文本文件中的空行之外,但仍包含空格

我应该怎么做才能将多个 ctypes 数据类型分配给 Python 中的单个 ctypes 实例?

我应该怎么做才能使用 react native expo 在谷歌地图中添加当前位置?

我应该怎么做才能在游戏中获得更好的FPS

我应该怎么做才能找到指向Confluence用户家的超链接?