findbugs сообщает неправильный номер строки и подавляет ошибку? - PullRequest
1 голос
/ 27 марта 2012

У меня есть класс Java, который использует System.GC () для расчета использования памяти.Однако, когда я запускаю findbugs, он всегда сообщает неверный номер строки.Вопрос 1: Я запустил это с помощью Intellij плагина findbugs, а также встроенного графического интерфейса findbugs.Тот же результат.Я что-то здесь не так делаю?

  1. util.MemoryTestBench.lotsOfGC () вызывает сборку мусора;чрезвычайно сомнительно, кроме кода для бенчмаркинга. Class: MemoryTestBench (util) Строка: 35 - 35 ====>, которая является Thread.sleep (100) ????????

  2. Мертвое хранилище для обработки. Class: MemoryTestBench (util) Строка: 23 - 23 ====>, возвращаемая usedMemory () - prevUsedMemory ?????

Вопрос 2: как можноЯ подавляю ошибку DM_GC?Я пытался @SuppressWarnings, который не работал.

тестовый код выглядит следующим образом:

package util;

import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;

import edu.umd.cs.findbugs.annotations.SuppressWarnings;

public class MemoryTestBench {
    @SuppressWarnings (value = "DM_GC",
                       justification = "call GC to measure memory size")
    public static long calculateMemoryUsage(ObjectFactory factory) {
        Object handle = factory.makeObject();
        long prevUsedMemory = usedMemory();
        handle = null;
        lotsOfGC();
        prevUsedMemory = usedMemory();
        handle = factory.makeObject();
        lotsOfGC();
        return usedMemory() - prevUsedMemory;
    }

    private static long usedMemory() {
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    }


    private static void lotsOfGC() {
        for (int i = 0; i < 20; i++) {
            System.gc();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

    public static void showMemoryUsage(ObjectFactory factory) {
        long mem = calculateMemoryUsage(factory);
        System.out.println(
                factory.getClass().getSimpleName() + " produced " +
                        factory.makeObject().getClass().getSimpleName() +
                        " which took " + mem + " bytes");
    }

    public static void main(String[] args) {
        showMemoryUsage(new BigConcurrentHashMapFactory());
    }
}

1 Ответ

0 голосов
/ 25 марта 2014

Вы должны поставить @ SuppressWarnings перед lotsOfGC , но не перед CalculateMemoryUsage

...