繁体   English   中英

如何解决这个OutOfMemoryError:Java堆空间

how to solve this OutOfMemoryError: Java heap space

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有以下程序进入数据库并获取值,我执行了查询,它也只给我47行,但是当我在控制台模式下运行同一程序时,它Exception in thread "main" java.lang.OutOfMemoryError: Java heap space给了我Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

package com.common;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import com.common.Query;

public class GetColumnValuesFromDifferentTypes {
@SuppressWarnings("unused")
public static void printColumns(String query){
    ABIDAO abidao = new ABIDAO();
    int numberOfColumns=0,columnType = 0;
    String columnValue = "", columnName = "";
    Map<String, String> headerMap = new LinkedHashMap<String, String>();
        Connection connection = abidao.getConnection();
        if (connection != null) {
            try {
                headerMap = getHeader(query);
                System.out.println("====================================================================");
                System.out.println("Header Map : "+headerMap);
                System.out.println("====================================================================");
                PreparedStatement reportTablePS = connection.prepareStatement(query);
                ResultSet reportTable_rst = reportTablePS.executeQuery();
                ResultSetMetaData reportTable_rsmd = reportTable_rst.getMetaData();
                numberOfColumns = reportTable_rsmd.getColumnCount();

                    int i =0;
                    while (reportTable_rst.next()) {
                            for (int columnIterator = 1; columnIterator <= numberOfColumns; columnIterator++) {
                                 columnValue = null;
                               columnName = reportTable_rsmd.getColumnName(columnIterator);
                               columnType = reportTable_rsmd.getColumnType(columnIterator);

                               if(columnType == Types.CHAR || columnType == Types.VARCHAR || columnType == Types.LONGVARCHAR)
                               {
                                   columnValue = reportTable_rst.getString(columnName);
                               }else if(columnType == Types.INTEGER || columnType == Types.BIGINT || columnType == Types.SMALLINT || columnType == Types.NUMERIC)
                               {
                                   long templong = reportTable_rst.getLong(columnName);
                                   if(!reportTable_rst.wasNull())
                                   {
                                       columnValue  = Long.toString(templong);
                                   }
                               }else if(columnType == Types.DECIMAL || columnType == Types.DOUBLE || columnType == Types.FLOAT || columnType == Types.REAL)
                               {
                                   double tempDouble1 = reportTable_rst.getDouble(columnName);
                                   if(!reportTable_rst.wasNull())
                                   {
                                       columnValue  = Double.toString(tempDouble1);
                                   }
                               } else if(columnType == Types.TIME || columnType == Types.TIMESTAMP || columnType == Types.DATE)
                               {
                                   Timestamp sqlTimeStamp = reportTable_rst.getTimestamp(columnName);
                                   if(!reportTable_rst.wasNull())
                                   {
                                       columnValue = sqlTimeStamp.toString();
                                   }
                               }
                               System.out.println("columnValue : "+columnValue);
                               System.out.println(",");

                            }
                            System.out.println("====================================================================");
                        }
            } catch (Exception ex) {
                ex.printStackTrace();
            }finally {
                try {
                    abidao.closeConnection(connection, null, null);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
}
@SuppressWarnings({ "unused" })
public static  Map<String, String> getHeader(String query) {
    ABIDAO abidao = new ABIDAO();
    String columnName="";
    int numberOfColumns=0,rowCount=1;
    Map<String, String> headerNamesMap = new LinkedHashMap<String, String>();
    Connection connection = abidao.getConnection();
    if (connection != null) {
        try {
            PreparedStatement reportTablePS = connection.prepareStatement(query);
            ResultSet reportTable_rst = reportTablePS.executeQuery();
            ResultSetMetaData rsmd = reportTable_rst.getMetaData();
            numberOfColumns = rsmd.getColumnCount();
            headerNamesMap.put("SNO","SNO");
              while (reportTable_rst.next()) {
                for (int i = 1; i <= numberOfColumns; i++) {
                  columnName = rsmd.getColumnName(i).toUpperCase();
                  if(!headerNamesMap.containsKey(columnName)){
                      headerNamesMap.put(columnName, columnName); 
                  }
                }
                rowCount++;
              }

        } catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            try {
                abidao.closeConnection(connection, null, null);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    return headerNamesMap;
}
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
    String query = "";
    Map dynamicQueryMap = new HashMap();
    Query queryObj = new Query();

    try {
        dynamicQueryMap = queryObj.getComplexReportQuery();
        if(dynamicQueryMap.containsKey("query")) query = dynamicQueryMap.get("query").toString();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    printColumns(query);

}
}

这是从Query方法返回的查询:

select
pi.po_number,poi.unit_cost,pi.placed_date CreateDate,
case when isnull(pi.date_closed) then pi.scheduled_arrival_date  
else pi.date_closed end as ReceviedDate,
poi.order_quantity,poi.roll_number,p.product_sku product_name,
pc.product_category_name,poi.rec_vendor_quantity,pv.vendor_name,p.et_conversion_unit_quantity,pi.note
from
purchase_order as pi,
purchase_order_inventory as poi,
product_vendors as pv,
products AS p,
product_categories AS pc
where
pi.purchase_order_id=poi.purchase_order_id and
pc.product_category_id=p.product_category_id and
poi.product_id = p.product_id and
poi.product_category_id=pc.product_category_id and
pi.vendor_id=pv.product_vendor_id and
( ( pi.date_closed  >= '2012-01-01' and pi.date_closed <='2012-09-05 23:59:59' ) 
or ( pi.scheduled_arrival_date  >= '2012-01-01' and pi.scheduled_arrival_date <='2012-09-05 23:59:59') ) and
pi.po_type=0 
and pi.status_id = 0 and  poi.transaction_type = 0  
order by pi.po_number ;

我在这里面临的问题是什么! 请帮我找出来。

4 个回复

您需要关闭所有资源,而不仅仅是连接。 例如PreparedStatement.close()和ResultSet.close()如果不这样做,它们将被保留并成为内存泄漏的一种形式。

我建议您使用jmap -histo:live {pid}或使用内存分析器(例如VisualVM或YourKit)来确认。

您应该关闭Connection以及ResultSet和Statements,以避免内存泄漏。

并且不要忘记在再次使用它们之前关闭语句和其他资源。

Statement stmt = ...;
...
stmt.close();
stmt = ...

在避免程序错误以节省更多内存之后,您可以尝试通过更改JVM的配置为应用程序设置特定的堆大小。 看一下这篇文章: http : //informix-zone.com/node/46

堆大小还取决于数据库配置文件中定义的共享缓冲区,您必须增加数据库配置文件中的共享缓冲区大小。

要监视堆,可以使用监视工具:

  • 映射

  • 监控器

4 OutOfMemoryError Java堆空间

我们在tomcat 5.5上使用JDK6生产环境。 上周将系统升级到tomcat 7 JDK 7.从那时起,我们每天都会收到OutOfMemoryError。 我添加了标志来捕获OOM上的堆转储。 使用Memory Analyzer Tool分析它们。 转储显示可疑对象com.sun ...

5 OutOfMemoryError:Java堆空间

我在使用Java OutOfMemoryError时遇到问题。 该程序基本上会查看在mysql工作台上运行的mysql表,并查询它们以获取某些信息,然后将它们放入CSV文件中。 该程序可以在较小的数据集上正常运行,但是一旦我使用较大的数据集(数小时而不是40分钟的日志记录信息),我就会收 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM