求教内存溢出问题,路过的各位大侠帮忙看看,谢谢!

Snys 发布于 2011/11/30 21:26
阅读 466
收藏 0

我用SAX解析xml文件,利用vector存放标签名tagName,然后再把标签名一个一个写到一个新的xml中去,但是当所读文件大小超过40M的时候就发生内存溢出了,我已经把Myeclipse的配置文件中的内存调的很大了,现在不知道怎么办了,我的程序如下所示,请各位路过的大侠看看,指点指点,谢谢。

public class PraseXML extends DefaultHandler

{

  private Vector<String> tagName;


 
 
  // 开始解析XML文件
  public void startDocument() throws SAXException
  {
    tagName = new Vector<String>();
  }

  // 结束解析XML文件
  public void endDocument() throws SAXException
  {
          File f=new File("d:"+File.separator+"votes.xml");
        BufferedWriter out=null;
        try {
            out=new BufferedWriter(new FileWriter(f,true));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //String str="Hello World";
       
       
    for (int i = 0; i < tagName.size(); i++)
    {
        try {
            out.write(tagName.get(i));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(tagName.get(i).equals(">")){
            try {
                out.write("\n");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
      }
    try {
        out.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
  public void startElement(String uri, String localName, String qName,
      Attributes attributes) throws SAXException
  {
    // 节点名称
      tagName.add("<"+qName+">");

  }

 
     //在遇到结束标签时调用此方法
  
  public void endElement(String uri, String localName, String qName)
      throws SAXException
  {
    // 节点名称
      tagName.add("</"+qName+">");
  }
  public static void main(String[] args)
  {
    String filename = "votes.104.h.rdf";
    SAXParserFactory spf = SAXParserFactory.newInstance();
    try
    {
      SAXParser saxParser = spf.newSAXParser();
      saxParser.parse(new File(filename), new PraseXML());
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  public Vector getTagName()
  {
    return tagName;
  }

  public void setTagName(Vector tagName)
  {
    this.tagName = tagName;
  }
}
加载中
0
V
V
你能不能分断读呢,假如这个文件超大,几个G,那你怎么调都溢出了
Snys
Snys
超过40M已经溢出了,我觉得应该是往容器里边添加的时候就已经溢出了。
0
Andre.Z
Andre.Z

Java6.0新特性之StAX,xml文件一大,普通方法,必然有内存溢出问题。

Andre.Z
Andre.Z
@Snys : 不是有链接的么???
Snys
Snys
那怎么办?
0
JavaGG
JavaGG
你设置最大内存是多小?
Snys
Snys
512M。
0
芙蓉镇
芙蓉镇
需要设置的不应该是MyEclipse的最大内存,应当设置的是你所运行的Java程序的最大内存,在运行设置中增加jvm参数-Xmx来设置
Snys
Snys
@芙蓉镇 : 恩,谢谢,这样确实可以,那么再Myeclipse中有办法没?
芙蓉镇
芙蓉镇
@Snys : 不是MyEclipse的问题,而是执行你写的Java程序的问题,可以试着直接用jdk的命令行来执行你的程序,在jvm参数上加上最大和最小内存的参数,如: java -Xms128m -Xmx256m 主类名 限制jvm初始堆内存为128mb,最大堆内存256mb 上面这些在MyEclipse中的Run Configurations里也可以设置的哦
Snys
Snys
那就是在myeclipse.ini中把Xms设置大点儿么,我已经设置了512M了。
0
JavaGG
JavaGG

...是设xmx 不是xms  

xms是最少使用内存

Snys
Snys
恩,了解了,谢谢。
0
SoftRock
SoftRock
这是<java io, 2nd ed>里面的一段代码,14.1. Copying Files with Buffers,可以把写入部分放到 endElement 中:
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class NIOCopier {
  public static void main(String[] args) throws IOException {
    FileInputStream inFile = new FileInputStream(args[0]);
    FileOutputStream outFile = new FileOutputStream(args[1]);
    FileChannel inChannel = inFile.getChannel( );
    FileChannel outChannel = outFile.getChannel( );
    for (ByteBuffer buffer = ByteBuffer.allocate(1024*1024);
    inChannel.read(buffer) != -1;
    buffer.clear( )) {
      buffer.flip( );
      while (buffer.hasRemaining( )) outChannel.write(buffer);
    }
    inChannel.close( );
    outChannel.close( );
  }
}
Snys
Snys
buf.put()里边好像不能把容器里边的元素直接读出来放进去。
0
芙蓉镇
芙蓉镇

->那么再Myeclipse中有办法没?

@Snys 有啊,其实和命令行方式一样,在不管是Myeclipse还是纯eclipse都有一个运行java应用程序的设置界面,其中有配置jvm参数的部分,

在这个菜单下
Run->Run Configurations

如下图红色部分

应该很详细了吧,呵呵

Snys
Snys
谢谢啊,确实有用。
0
小熊猫大暴走
小熊猫大暴走
java也内存溢出?
Snys
Snys
恩。。。
0
中山野鬼
中山野鬼

引用来自“googler”的答案

java也内存溢出?
很正常。没有绝对的东西。只是故事延后发生了。
Snys
Snys
确实。。。
返回顶部
顶部