为什么这种静态方法需要更长时间才能完成?

时间:2017-07-24 20:45:09

标签: java static static-methods

我有一个静态方法,用于处理ResultSets并让它返回一个对象。有时它可以一次又一次地被调用多次。例如,在我正在处理的当前项目中,静态方法被调用超过56,000次。无论出于何种原因,当它被一遍又一遍地调用时,该方法需要更长和更长的时间来回复。

我一直在使用System.currentTimeMillis()来确定代码中的哪个位置需要更长时间才能完成,虽然我知道currentTimeMillis()不是100%准确,但是时间是慢慢地重复完成这部分代码需要随着时间的推移而增加。

以下是代码:

public static Object createFromResultSet(ResultSet someResultSet, String someIndex) throws SQLException, Exception {
    { ... }
    List<Object[]> result = new ArrayList();
    List<String> columnNames = new ArrayList();
    List<Object> addRow;

    // the code below will take longer and longer to complete as the method is called over and over again
    while (someResultSet.next()) {
        addRow = new ArrayList();
        for (int x = 0; x < columnNames.size(); x++) {
            if (someResultSet.getObject(x + 1) instanceof Double) {
                Double someValue = someResultSet.getDouble(x + 1);
                addRow.add(new BigDecimal(someValue).toPlainString());
            }
            else if (someResultSet.getObject(x + 1) != null) addRow.add(someResultSet.getObject(x + 1).toString());
            else addRow.add("");
        }
        result.add(addRow.toArray());
    } 
    { ... }
}

也许我并不完全理解静态方法在Java中是如何工作的,但我认为这个方法中的所有变量只能在调用静态方法的时候使用一次(即,如果方法是再次调用,没有从前一次调用该方法的值继承的值)。除了传入的变量之外,没有在方法外声明的正在使用的静态变量。但是,随着时间的推移,该方法变得越来越慢,这让我相信以前调用此方法时会使用数据。在我当前项目中调用的56,000次中,此报告可能需要长达一个小时才能运行。

有些东西告诉我,我的逻辑有些不对劲,但对于我这样的人,我不知道发生了什么。

1 个答案:

答案 0 :(得分:-1)

由于内存已满,这种情况正在发生。 你应该做3件事:

  1. 让它们全球化。这样就不会在每个方法出口上调用GC。内存将只分配一次,不会进行重定位 - 重定位。

    List<Object[]> result;
    List<String> columnNames;
    List<Object> addRow;
    
  2. &#34; createFromResultSet&#34;方法,清除这些清单。 E.g:

    addRow.clear();
    
  3. 创建&#34; addRow = new ArrayList();&#34;在声明的地方。

    List<Object> addRow = new ArrayList();