gpt4 book ai didi

java - 多线程使用中的变量声明,Java [内存泄漏问题]

转载 作者:行者123 更新时间:2023-12-02 05:50:54 25 4
gpt4 key购买 nike

我正在使用 Java 中的 Jsoup 库构建一个爬虫。

代码结构如下:

public static BoneCP connectionPool = null;
public static Document doc = null;
public static Elements questions = null;
static
{

// Connection Pool Created here
}

在 MAIN 方法中,我从 10 个不同的线程调用了 getSeed() 方法。

getSeed() 方法从数据库中选择 1 个随机 URL,并将其转发到 processPage() 方法。

processPage() 方法使用 jSoup 库连接到从 getSeed() 方法传递的 URL,并从中提取所有 URL,并进一步将它们全部添加到数据库中。

这个过程每周 24 小时持续进行。

问题是:在 processPage() 方法中,它首先使用以下方法连接到从 getSeed() 方法发送的 URL:

doc = Jsoup.connect(URL)

然后,对于通过访问该特定 URL 找到的每个 URL,jSoup 会再次建立一个新连接。

questions = doc.select("a[href]");
for(Element link: questions)
{
doc_child = Jsoup.connect(link.attr("abs:href"))
}

现在,如果我将 doc 和 questions 变量声明为全局变量,并在 processPage() 方法中的整个处理后将它们清空,它可以解决内存泄漏的问题,但其他线程会停止,因为 doc 和 questions 之间被清空。接下来我应该做什么?

最佳答案

如果您使用静态字段,特别是对于这种状态,那么这就是“错误的设计”,并且根据您的描述,它的行为似乎非常线程不安全。我不知道为什么你认为你手头有内存泄漏,但无论它是什么,诊断一切是否正常都更容易。

我想说的是,尝试让一些东西基于这样的东西工作:

class YieldLinks implements Callable<Set<URI>>{
final URI seed;
YieldLinks(URI seed){
this.seed = seed;
}
}


public static void main(String[] args){
Set<URI> links = new HashSet<>();
for(URI uri : seeds){
YieldLinks yieldLinks = new YieldLinks(uri);
links.addAll(yieldLinks.call());
}
}

一旦这个单线程工作正常,您就可以考虑添加线程。

关于java - 多线程使用中的变量声明,Java [内存泄漏问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23550606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com