gpt4 book ai didi

java - 如何修复java中的内存泄漏

转载 作者:行者123 更新时间:2023-12-02 11:19:58 26 4
gpt4 key购买 nike

我目前正在尝试编写一个程序,从 steam 获取字符串化的 json 对象,并使用该对象来确定我是否可以在 steam 市场上购买商品。

它有效,但是我似乎遇到了大量内存泄漏,而且我不知道如何解决这个问题,因为我是一名初学者程序员。这是代码:

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;


public class SteamMarketAlert {

@SuppressWarnings("unused")
private JAlertWindow alert;
private URL jsonUrl;
private float walletValue;
private boolean itemBuyable;

public SteamMarketAlert(URL itemUrl, float walletValue)
{
this.itemBuyable = false;
this.jsonUrl = getJSONurl(itemUrl);
this.walletValue = walletValue;
}

private URL getJSONurl(URL itemUrl)
{
String jsonString = itemUrl.toString();

String firstPart = jsonString.substring(0, jsonString.indexOf("market/") + "market/".length());

String appid = jsonString.split("/")[5];
String marketHashName = jsonString.split("/")[6];

String secondPart = "priceoverview/?currency=2&appid=" + appid + "&market_hash_name=" + marketHashName;

try {
return new URL(firstPart + secondPart);
} catch (MalformedURLException e) {
System.err.println("Failed to create json url");
return null;
}

}

public void checkMarket()
{
Thread thread = new Thread(){
@Override
public void run(){
try {
while(!itemBuyable)
{
sleep(5000);
if(isBuyable(getPagehtml()))
itemBuyable = true;
}
alert = new JAlertWindow();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};

thread.start();


}

private boolean isBuyable(String pagehtml)
{
int firstIndex = pagehtml.indexOf(";") +1;


float marketValue = Float.parseFloat(pagehtml.substring(firstIndex, firstIndex + pagehtml.substring(firstIndex, pagehtml.length()).indexOf("\"")));

return (marketValue <= walletValue)? true:false;
}

private String getPagehtml(){

try(Scanner scanner = new Scanner(jsonUrl.openConnection().getInputStream())) {

scanner.useDelimiter("\\Z");
return scanner.next();
} catch (IOException e) {
e.printStackTrace();
return null;
}

}

public static void main(String[] args)
{
try {
float walletValue = 82.64f;
URL itemUrl = new URL("http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P90%20%7C%20Asiimov%20%28Factory%20New%29");
SteamMarketAlert sma = new SteamMarketAlert(itemUrl,walletValue);
sma.checkMarket();


} catch (MalformedURLException e) {

e.printStackTrace();
}

}
}

我已将问题范围缩小到 checkMarket() 方法。但是,我似乎无法弄清楚发生了什么事。您能否指出我如何解决此问题(并可能指出我的代码中的所有缺陷),请注意 JAlertWindow 对象仅显示一个带有“CAN BUY”的 JFrame - 没什么特别的。

编辑:自发布以来我更新了代码,并且用户告诉我 try-with-resource block 存在。感谢所有帮助我了解 java 垃圾收集工作原理的人。 :)!

最佳答案

在 Java 中,除非出现 OutOfMemoryException 或看到持续的垃圾收集,否则这可能不是内存泄漏。

10 分钟内使用 18MB 看起来并不像是内存泄漏,这就是 Java 的工作原理。如果您确实想确定,您可以打开详细 GC 并查看它的收集频率,但我认为您还没有遇到真正的问题。

关于java - 如何修复java中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31351379/

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