我用groovy编写了一个爬虫DSL,该爬虫DSL使用单线程事件循环来模拟并发执行。但是,当使用此DSL时,我发现程序的内存使用率异常高。此程序不应占用1.7G的内存。我使用jprofiler分析了运行时堆内存,并发现在以下代码片段中创建了大量char []和String对象实例:
reqs = []
domains = ['xxx']
baseUrl = 'https://xxxx'
spider {
generateRequest {
this.reqs.clear()
if (this.domains != null && this.domains.size() > 0) {
this.reqs.add(new HttpGet("${this.baseUrl}${this.domains.get(0)}"))
}
return this.reqs
}
起初我以为GString延迟生成字符串是个问题,所以我修改了这段代码:
reqs = []
url = 'https://xxxx'
spider {
generateRequest {
this.reqs.clear()
if (this.domains != null && this.domains.size() > 0) {
this.reqs.add(new HttpGet(this.url))
}
return this.reqs
}
但是它不起作用,但是它使内存使用量增长更快。我刚刚开始使用groovy,使用groovy闭包有问题吗? jprofiler