java.lang.OutOfMemoryError:爬网时超出了GC开销限制

java.lang.OutOfMemoryError:爬网时超出了GC开销限制,java,out-of-memory,Java,Out Of Memory,我正在尝试爬网一个网站并插入我在哈希集中找到的href,插入650个链接后,我得到异常java.lang.OutOfMemoryError:超出了GC开销限制。 我怎样才能让它工作 我把代码放在下面: public void getPageLinks(String URL, String otherlinksSelector ) { if (!links.contains(URL)) { try { Document document = Jsou

我正在尝试爬网一个网站并插入我在哈希集中找到的href,插入650个链接后,我得到异常java.lang.OutOfMemoryError:超出了GC开销限制。 我怎样才能让它工作

我把代码放在下面:

public void getPageLinks(String URL, String otherlinksSelector ) {
    if (!links.contains(URL)) {
        try {
            Document document = Jsoup.connect(URL).userAgent("Mozilla").get();
            Elements otherLinks = document.select(otherlinksSelector); 
            for (Element page : otherLinks) {
                if (links.add(URL)) {
                    System.out.println(URL);
                }
                getPageLinks(page.attr("abs:href"),otherlinksSelector);
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
}

您可以继续写入指向文件的链接,而不是将其保留在内存中。
这样,内存中的数据就会更少。如果要解析到过去找到的其他链接,可以从同一个文件中读取。

First和formost,一个只在内存中管理所有URL的爬虫程序必须非常挑剔哪些URL需要保留,哪些URL需要丢弃,因为内存是爬虫程序的一个限制因素,除非你将这些信息外部化,或者拥有一个拥有无限内存的集群。在OOMing之前,650个URL是一个非常小的数量TBH。异常至少表明garbate收集器在尝试释放内存时使用了太多的时间,这表明最大可用内存通常是不够的

了解内存占用情况的一种方法是使用探查器,在特定的时间间隔进行堆转储,然后检查转储中是否有可用的对象,它们占用了多少内存,以及哪个对象引用了它们。另外,尝试在获取堆之前强制GC以了解内存中保留的内容。通过这种方式,您可能会看到阻止收集器释放更多内存的原因

接下来,有几篇科学论文。。。这项研究的主题是以性能的方式持久化visite URL,包括唯一的检查。有几个开源实现正在进行中,尽管包括我的方法在内,大多数都还没有完成;这可能是最主要的方法