我正在尝试减少以下代码使用的内存量。我希望它最多使用5-10MB的RAM,但我不确定这是否可行。在启动时,它现在大约需要10,1MB,而Thread.sleep
大约需要40MB。我尝试过使用BufferedReader
的不同实现,但这似乎没有改变任何东西。我不是最好的java,我在内存管理上特别糟糕,所以我可能错过了一些非常愚蠢的东西。如果有人能给我一些关于改进内存管理代码的指示,那真是太棒了!
package tsviewerscanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;
public class TSViewerScanner {
static URL url;
public static void main(String[] args) {
System.out.println("Started");
while (true) {
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
try {
url = new URL("https://www.tsviewer.com/ts3viewer.php?ID=1040506");
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
try {
URLConnection conn = url.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
String WebContentStr = reader.lines().collect(Collectors.joining("\n"));
if (WebContentStr.toLowerCase().contains("error code: 2568") && WebContentStr.toLowerCase().contains("insufficient client permissions")) {
System.out.println("WebContentStr contains both strings");
} else {
System.out.println("Strings not found");
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
答案 0 :(得分:1)
此代码的主要内存利用率问题是在检查字符串是否存在之前将整个响应加载到内存中。
不是将整个流缓冲到一个大字符串中,而是在读取每行时检查每一行,一旦检查旧行就可以进行垃圾收集。
action.data
但是我怀疑你所看到的行为更多地与你误解JVM如何利用内存有关。
JVM使用的内存量更多地取决于它的分配量,程序运行的时间以及程序运行时产生的垃圾量。
JVM的内存使用量通常不表示在任何给定时间堆应用程序需要多少
可以通过多种方式调整JVM内存使用情况,但这超出了这个答案的范围。