Больше нет дескрипторов после ограничения количества генерируемых объектов SWT - PullRequest
0 голосов
/ 10 января 2019

Мое приложение использовало несколько Hashmaps для хранения объектов Color и Image, которые генерировались случайным образом при появлении нового ключа (который может быть бесконечным количеством).

Чтобы уменьшить использование памяти, я использую хэш-функцию, чтобы ограничить количество случайно сгенерированных цветов и изображений до 229. Как ни странно, когда я хранил практически бесконечные цвета и изображения, программа работала без серьезных проблем (за исключением, конечно, утечки).

Теперь, когда я пытаюсь странным образом повторно использовать ограниченный набор Объектов через несколько секунд, я продолжаю получать исключение:

org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTError: No more handles)

Генерация карт выглядит примерно так:

static Map<Integer, Color> color = new Hashtable<>();
    private static final int MAX_COLORS = 229;

    private static void generateColor(String typeName) {
        if (mapping.containsKey(typeName)) {
            return;
        }

        Color c = generateRandomColor(typeName);
        color.put(typeNameHash(typeName), c);
    }

    private static Color generateRandomColor(String typeName) {
        if(color.containsKey(typeNameHash(typeName))){
            return color.get(typeNameHash(typeName));
        }
        int red = random.nextInt(255);
        int green = random.nextInt(255);
        int blue = random.nextInt(255);
        return new Color(Display.getCurrent(), red, green, blue);
    }

    private static int typeNameHash(String typeName){
        return Math.abs(typeName.hashCode())%MAX_COLORS;
    }

Как это возможно, что теперь, когда у меня должно быть меньше объектов, я так быстро сталкиваюсь с такого рода исключениями?

Заранее спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Решением моей проблемы было то, что я все еще использовал строки в качестве ключей, вместо того, чтобы в некоторых случаях вызывать хеш-функцию для строк. Так как HashMaps принимает Objects-type для ключей, компилятор не предупредил меня об этом.

Проверка всех частей кода, которые я вставил в Hashmap, и проверка на то, что хеш-функция использовалась везде, разрешила проблему.

...