【问题标题】:How to overwrite a String in Java?如何在 Java 中覆盖字符串?
【发布时间】: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 中不存在?

标签: java string memory jvm


【解决方案1】:

将 XmX 设置为您喜欢的东西。 Xmx=B 标志告诉您的 JVM 使用最大 B 内存量,当您达到该内存量时它将触发 GC。请注意这一点,如果你通过某种奇迹,实际上需要超过 Xmx 并且 JVM 无法分配新内存,它将崩溃并出现内存不足异常。

只有在你自己已经正确清理之后才使用它!

更多信息:

Xmx and Xms

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2012-04-08
    • 2013-08-22
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多