Мое приложение использовало несколько 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;
}
Как это возможно, что теперь, когда у меня должно быть меньше объектов, я так быстро сталкиваюсь с такого рода исключениями?
Заранее спасибо!