java.lang.OutOfMemoryError:Java堆空间,创建一个很长的Myclass列表

时间:2016-11-13 01:25:08

标签: java memory serialization heap

我正在从互联网上解析一些数据以创建一个arraylist,其中每个Politician类都有一个字段HashMap。每个HashMap都包含132 * 150条目。填充第164个映射后,我遇到了这个异常:java.lang.OutOfMemoryError:Java堆空间。 我想使用序列化来存储这个大的列表,以便将来使用它。 我该怎么办?我应该序列化政治家实例而不是整个列表吗?是否有其他最佳方式来存储这些数据? (如果需要)我也将这些数据写入文件。我认为将数据存储为“对象”以提高易用性。 一些代码:

private static void setVotiParlamentari(ParserOpenParlamento parser, ArrayList<Politician> politicianList){
for(Politician p : politicianList){
    String filepath = System.getProperty("user.dir") + File.separator + "io_files" + File.separator + "info_parlamentari2";
    String filename = File.separator + p.getName() + ".txt";
    Iterator<String> votesIterator = parser.parsePoliticianVotes(p).iterator();
    FileWriter w = null;
    try {
        w = new FileWriter(filepath+filename);
    } catch (IOException e) {
        e.printStackTrace();
    }
    PrintWriter wr = new PrintWriter(new BufferedWriter(w));
    while (votesIterator.hasNext()){
        String vote = votesIterator.next();
        // i.e. for String vote = 35521:08/11/2016:Favorevole:SCCI-MAIE Favorevole:APPROVATA:391
        String tokens[] = vote.split(parser.getSplittingChar());
        String idVote = tokens[0];
        String dateVot = tokens[1];
        String politicianVote = tokens[2];
        String groupVote = tokens[3];
        String result = tokens[4];
        String difference = tokens[5];
        wr.write(idVote+":"+dateVot+":"+politicianVote+":"+groupVote+":"+result+":"+difference+System.getProperty("line.separator"));
        p.getVotazioni().put(Integer.parseInt(idVote), new Votazione(idVote, dateVot, politicianVote, groupVote, result, difference));
    }
    wr.close();
}

}

4 个答案:

答案 0 :(得分:1)

如果您使用Eclipse IDE:

单击鼠标右键 Run As - Run Configuration - Arguments - Vm Arguments,然后添加此项(对于增量Java堆内存大小,您还可以选择其他值)

-Xmx2048m

如果您使用命令行,则添加到尾部:

-Xmx2048

2048是堆内存的最大大小,你也可以选择其他值)

答案 1 :(得分:0)

估计你的java程序需要多少内存,如果它不超过你的PC内存那么你可以通过JVM Parameter为你的程序提供更多的内存,否则你需要change your algorithm。< / p>

答案 2 :(得分:0)

java -Xmx2048m <file-name>.jar

-Xmx2048m是您为java分配的堆大小,只需根据需要调整大小

答案 3 :(得分:0)

您正在使用大量可能导致内存问题的String个对象,因此我修改了如下所示的代码,这将尝试减少堆空间使用并运行更好:

private static void setVotiParlamentari(ParserOpenParlamento parser, ArrayList<Politician> politicianList) {

 final String DELIMITER = ":";

 for(Politician p : politicianList){
    String filepath = System.getProperty("user.dir") + File.separator + "io_files" + File.separator + "info_parlamentari2";
    String filename = File.separator + p.getName() + ".txt";
    Iterator<String> votesIterator = parser.parsePoliticianVotes(p).iterator();
    FileWriter w = null;

    try {
        w = new FileWriter(filepath+filename);
    } catch (IOException e) {
        e.printStackTrace();
    }

    PrintWriter wr = new PrintWriter(new BufferedWriter(w));

    StringBuffer sb = null;
    String tokens[] = null;
    String vote = null;

    while (votesIterator.hasNext()){

        vote = votesIterator.next();
        // i.e. for String vote = 35521:08/11/2016:Favorevole:SCCI-MAIE Favorevole:APPROVATA:391

        tokens[] = vote.split(parser.getSplittingChar());

        sb = new StringBuffer();
        sb.append(tokens[0]);
        sb.append(DELIMITER);
        sb.append(tokens[1]);
        sb.append(DELIMITER);
        sb.append(tokens[2]);
        sb.append(DELIMITER);
        sb.append(tokens[3]);
        sb.append(DELIMITER);
        sb.append(tokens[4]);
        sb.append(DELIMITER);
        sb.append(tokens[5]);
        sb.append(System.getProperty("line.separator"));

        wr.write(sb.toString());

        p.getVotazioni().put(Integer.parseInt(tokens[0]), new Votazione(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5]));
    }
    wr.close();
}

除此之外,您可能还需要增加JVM堆大小-Xmx2048m