gpt4 book ai didi

java - 如何减少此代码/bufferedreader的内存使用

转载 作者:行者123 更新时间:2023-12-01 09:33:03 24 4
gpt4 key购买 nike

我正在尝试减少下面代码使用的内存量。我希望它最多使用 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();
}
}
}
}

最佳答案

此代码的主要内存利用率问题是,在检查字符串是否存在之前,整个响应已加载到内存中。

您可以在读取每一行时检查它们,而不是将整个流缓冲到一个大字符串中,一旦检查,旧行就可以被垃圾收集。

try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
AtomicBoolean hasError = new AtomicBoolean();
AtomicBoolean hasInsufficentPermission = new AtomicBoolean();
reader.lines().map(String::toLowerCase).forEach(line-> {
if(line.contains("error code: 2568")) hasError.set(true);
if(line.contains("insufficient client permissions")) hasInsufficentPermission.set(true);
});
if (hasError.get() && hasInsufficentPermission.get()) {
System.out.println("WebContentStr contains both strings");
} else {
System.out.println("Strings not found");
}
}

但是我怀疑您所看到的行为更多地与您误解 JVM 如何利用内存有关。
JVM 使用的内存量更多地与分配的内存量、程序运行的时间以及程序运行时产生的垃圾量有关。
JVM 的内存使用情况通常并不表示任何给定时间堆应用程序需要多少内存。
有多种方法可以调整 JVM 内存使用情况,但这超出了本答案的范围。

关于java - 如何减少此代码/bufferedreader的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39239945/

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