java - 为什么这个静态方法慢慢地需要更长的时间才能完成?

标签 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. 使它们全局化。这样每个方法退出时就不会调用 GC。内存只会分配一次,不会发生重定位-解除分配。

    List<Object[]> result;
    List<String> columnNames;
    List<Object> addRow;
    
  2. 在“createFromResultSet”方法结束时,清除这些列表。例如:

    addRow.clear();
    
  3. 创建“addRow = new ArrayList();”在声明本身的地方。

    List<Object> addRow = new ArrayList();
    

关于java - 为什么这个静态方法慢慢地需要更长的时间才能完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45289748/

相关文章:

php - Symfony:服务容器 VS 静态方法

struct - 如何将我的 Rust 结构之一的实例声明为静态的?

python - Django CSS背景图片不会改变

java - 为什么静态类会使我的机器人崩溃?

c++ - 我应该从静态成员方法返回什么类型的指针

java - 显式强制转换调用构造函数?

java - 如何以编程方式获取在 youtube 中托管的视频的嵌入 HTML 代码

java - Spring Roo 和读取属性文件

java - <表格 :select> objects binding through Converter in Spring MVC

java - 将运行 JUnit 测试作为 Jenkins 配置的一部分