【发布时间】:2016-04-15 15:50:20
【问题描述】:
我有一个检查网站更新的小程序,它通过将网站的 HTML 加载到字符串对象中,然后在该字符串中搜索模式,但是因为网站占用了大量空间,我已经注意到了该应用程序的内存使用量随着每次扫描而增长。我认为这是因为不是重写旧字符串的内容,而是创建一个新字符串,并且我不知道旧字符串是什么,但不删除它。
这是我写的代码
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Scanner;
/**
* Created by zaers on 15-Apr-16.
*/
public class PageSearch {
public static void main(String[] args){
while(true) {
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
System.exit(1); //OS screwed our program
}
try {
String out = new Scanner(new URL("http://blog.dota2.com/").openStream(), "UTF-8").useDelimiter("\\A").next();
if(out.contains("6.87")){
java.awt.Desktop.getDesktop().browse(new URI("http://www.youtube.com/watch?v=-kcOpyM9cBg&t=7m21s"));
break;
}
else continue;
} catch (IOException e) {
System.exit(2); //Blog is kill
} catch (URISyntaxException e) {
System.exit(3); //YouTube is kill
}
}
}
}
我注意到这一点是因为该应用在首次运行时占用 8.5mb,但目前为 27.8,并且随着每次检查而增长。
【问题讨论】:
-
从技术上讲,堆空间可以在没有 GC 的情况下增长,直到在 Eden 生成中有足够的可用空间
-
为什么要在
while(true)循环中创建一个新的Scanner? -
你没有关闭你的流 o_O 你去。完成后关闭您的流!
-
@MichaelDibbets iirc URL 流自行关闭?
-
@TheLostMind 因为我需要 String 从每次迭代中重新更新,从技术上讲 Scanner 应该是一个右值,或者那些在 Java 中不存在?