13
回答
java的垃圾回收处理搞不懂呀,请大侠帮忙指点。
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   
public class biaoqian {
 public void kaishi() throws Exception {
  String lujing = "d:\\XiaZaifuzhi\\";
  String xinlu;

  for (int j = 0; j < 100; j++) {
   if (j < 10)

    xinlu = lujing + "0" + j + "\\";
   else
    xinlu = lujing + j + "\\";
   File filesDir = new File(xinlu);
   File[] files = filesDir.listFiles();
   System.out.println(xinlu);
   for (int i = 0; i < files.length; i++) {
    String html;
    html = loadhtml(files[i]);
    htmlparser(html);
   }
  }
 }
 public String loadhtml(File file) throws Exception {

  BufferedReader br = null;
  String pathFile = file.getAbsolutePath();
  StringBuffer sb = new StringBuffer();
  try {
   br = new BufferedReader(new InputStreamReader(new FileInputStream(
     pathFile), "UTF-8"));
   String temp = null;
   while ((temp = br.readLine()) != null) {
    sb.append(temp + "\n");
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return sb.toString();
 }

 public void htmlparser(String html) {

  String body;

  try {
   Parser parser = new Parser(html);
   parser.setEncoding("gb2312");
   NodeFilter filter_title = new AndFilter(new TagNameFilter("div"),
     new HasAttributeFilter("id", "db-tags-section"));
  NodeList nodelist = parser.parse(filter_title);
   Node node_body = nodelist.elementAt(0);
   Parser body_parser = new Parser(node_body.toHtml());
   TextExtractingVisitor visitor = new TextExtractingVisitor();
   body_parser.visitAllNodesWith(visitor);
   body = visitor.getExtractedText();
       fenge(body);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void fenge(String str) {
  String matchReglar = "[ ]";
  str = str.replaceAll("豆瓣成员常用的标签\\(共\\d{1,}个\\)   · · · · · · ", "");
  Pattern pattern = Pattern.compile(matchReglar);
  String[] list = pattern.split(str);
  for (String string : list) {
   if (string != null && string.length() > 0) {
    string = string.replaceAll("\\(\\d{1,}\\)", "");
    System.out.println(string);
   }
  }
 }

 public static void main(String[] args) throws Exception {
  biaoqian shiyan = new biaoqian();
  shiyan.kaishi();
 }
}

上述代码都是局部变量,我感觉应当运行时占据的内存保持一定的水平,可是运行时,占据的内存不断增加。请大侠指点,不胜感激!

举报
hebeijpp
发帖于7年前 13回/660阅
共有13个答案 最后回答: 7年前
解析html文档占用的内存大是很正常的,你所说的占用内存不断增加,应该会有个顶的吧,多观察观察。

看你的代码是把文件完整读取到内存中,然后在使用HtmlParser解析的。

建议试试用流的方式读取解析html,有可能降低内存:new Parser(new Lexer(new Page( new FileInputStream("你的文件", "你的字符集");

另外32行“sb.append(temp + "\n");”修改成“sb.append(temp).append("\n");”

还有,如果你要解析的页面很大的话,建议你去调查一下你使用的HtmlParser是DOM还是SAX模型的,DOM模型的必然会很吃内存。。。

DOM是用标准的对象模型表示 XML 文档 Simple API for XML (SAX)使用应用程序提供的事件处理程序来处理XML 他们在处理过程中都可能占用大量内存 建议使用StAX—Streaming API for XML来解析 StAX保留了SAX 相对于DOM 的优点 通过把重心从结果对象模型转移到解析流本身 从理论上说能够处理无限的XML 流 因为事件固有的临时性 不会在内存中累积起来

跟语言没有半毛钱的关系  任何语言 当把new操作符放在 loop里 都要12分小心  到不一定非要手动去close() 这是误区中的误区 java是不需要手动作这样的蠢事的。  另外大缓冲的字符拼接多用SB 少用STR  你的内存优化 最大的切入点 应该是parser的模型 用dom4j 可能会快很多
顶部