加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在Clojure中强制垃圾收集是个好主意吗?

发布时间:2020-05-31 07:21:35 所属栏目:Java 来源:互联网
导读:我有一个Clojure程序在运行时消耗了大量的堆(我曾经在2.8GiB附近测量它),我正试图找到一种方法来减少它的内存占用.我目前的计划是经常强制进行垃圾收集,但我想知道这是不是一个好主意.我已经阅读了 How to force garbage collection in Java?和 Can I Force G

我有一个Clojure程序在运行时消耗了大量的堆(我曾经在2.8GiB附近测量它),我正试图找到一种方法来减少它的内存占用.我目前的计划是经常强制进行垃圾收集,但我想知道这是不是一个好主意.我已经阅读了 How to force garbage collection in Java?和 Can I Force Garbage Collection in Java?,并了解如何操作 – 只需调用(System / gc) – 但我不知道这是不是一个好主意,或者即使它是需要的.

这是程序的工作原理.我有大量遗留格式的文档,我正在尝试将其转换为HTML.遗留格式由几个XML文件组成:描述文档的元数据文件,包含指向任意数量内容文件的链接(通常是一个,但也可以是几个 – 例如,某些文档具有“主要”内容和单独的脚注文件).对于最小的文档,转换需要几毫秒到最大文档的大约58秒.基本上,我正在编写一个美化的XSLT处理器,虽然它的语言比XSLT好得多.

我刚开始在Clojure中编写的当前(相当天真)的方法构建了所有元数据文件的列表,然后执行以下操作:

(let [parsed-trees (map parse metadata-files)]
  (dorun (map work-func parsed-trees)))

work-func将文件转换为HTML并将结果写入磁盘,返回nil. (我试图丢弃每个文档的解析后的XML树,这在每次通过单个文档后非常大).我现在意识到虽然map是懒惰的,但是dorun抛弃了它迭代的序列的头部,我在解析树中保持seq头部的事实是我失败的原因.

我的新计划是将解析移动到work-func中,以便它看起来像:

(defn work-func [metadata-filename]
  (-> metadata-filename
      e/parse
      xml-to-html
      write-html-file)
  (System/gc))

然后我可以使用map或者pmap来调用work-func,因为我有两个双核CPU,并希望在处理完每个文档后丢弃大型XML树.

不过我的问题是:经常告诉Java“请跟我清理”是不是一个好主意?或者我应该跳过work-func中的(System / gc)调用,并在感觉需要时运行Java垃圾收集器?我的直觉是要保持调用,因为我知道(因为Java不能)在work-func的那一点上,堆上会有大量的数据可以被删除,但我欢迎来自更有经验的Java和/或Clojure编码员的意见.

解决方法

调用System / gc不是一个有用的策略.假设您现在无法减少代码的实际内存占用量,您应该确保避免使用主要GC.这将自动发生(通过调整Young Generation的大小直到所有临时数据都适合),或者您可以使用明确的JVM选项对其进行调整以使YG异常大.

只要你的短暂物体不会因为空间不足而溢出到老一代,你就会遇到非常短暂的GC暂停.您也不必担心显式调用GC:它会在Eden Space填满时发生.

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读