【问题标题】:Whitch gc strat shoud I use if I want to clean up a memory between operations and the time doesn't matter?如果我想清理操作之间的内存并且时间无关紧要,我应该使用哪个 gc 策略?
【发布时间】:2013-12-05 13:26:00
【问题描述】:

我有一个具体的问题。我有一个程序可以在大数据集中进行搜索。我在搜索器中有一个缓存,以使程序更快。这个缓存是一个包含哈希图的大哈希图。 我的主要功能是为数据集创建一个搜索器,获取搜索参数,进行搜索,将其写下来,然后对另一个数据集创建一个新的搜索器并再次进行搜索。

我给 VM 4gb 内存,一个缓存大约需要 1.5gb。因此,第一次和第二次搜索顺利且全速进行,但在第三次搜索中 gc 开始丢弃并占用 cpu 时间。

在代码中:

public static void main(String[] args) {
  Searchvals sv=new Searchvals("c:\\svs.txt")
  Searcher s=new Searcher("d:\\");
  s.init();
  s.makeSearch(sv);
  s.writeOut("c:\\out1.txt");
  System.gc();

  s=new Searcher("e:\\");
  s.init();
  s.makeSearch(sv);
  s.writeOut("c:\\out2.txt");
  System.gc();

  s=new Searcher("f:\\");
  s.init();
  s.makeSearch(sv);
  s.writeOut("c:\\out3.txt");
}

所以我正在搜索 gc 策略,如果我调用它,或者如果内存不足,它会大扫除。时间无关紧要,它不是一个负责任的应用程序,它是一个数据挖掘器,在每个进程之后我想释放所有可以通过的内存。

我尝试用谷歌搜索,但这不是一个简单的话题。

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    当没有垃圾时调用System.gc()(搜索器处于活动状态且其缓存已满)。

    您应该在调用System.gc() 之前分配s=null; 或者如果它不消耗大量内存s=new Searcher("e:\\");

    拆除缓存数据结构(HashMap.clear() 等)是另一种选择,以防您想重用您的 Searcher

    您确定没有讨厌的静态变量或对您的Searcher 或其部分的引用吗?

    【讨论】:

      【解决方案2】:

      您无法通过更改 GC 策略来改善这么多。由于与您为应用程序提供的堆数量相比,您的工作集太大了。我假设您的缓存已填满 + 一些内存用于其他对象/线程/服务等。而且我还假设您没有编写自己的缓存,并且您正在使用一个受人尊敬的框架。

      你可能有两个选择

      1. 使用堆外缓存(例如Apache Direct Memory)。 GC 时间取决于工作集的大小,在您的情况下为 1.5GB+(我假设您的缓存很快就会被填满)。
      2. 将缓存大小减少到 1GB,然后重试。

      【讨论】:

        猜你喜欢
        • 2017-07-23
        • 2010-09-07
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 2022-11-20
        • 2016-03-09
        • 2020-02-16
        相关资源
        最近更新 更多