Groovy приложение имеет тысячи экземпляров NumberAwareComparator? - PullRequest
1 голос
/ 09 октября 2011

Я запускаю приложение с интенсивным вводом-выводом, и когда я запускаю профилировщик jvisualvm, я вижу, что NumberAwareComparator занимает 33% памяти и 55% всех объектов!

Это нормально? Зачем это делать? Где я могу начать искать решение этой проблемы?

/ * более поздняя редакция - пример кода * /

//Using GPars
(0..length - 1).eachParallel { i ->
                def final h = [:]
                distHash[i] = h

                println("Calculating distances ")

                if (i + 1 < length - 1) {
                    ((i + 1)..length - 1).each {j ->
                        def d = distanceCalc.getDistance(paragraphs[i], paragraphs[j])
                        if (d < 0.25) {
                            h[j] = d
                        }
                    }
                }
            }

Спасибо!


Я думаю, что у меня есть какое-то объяснение, но я все еще не уверен насчет механизма. У меня была функция, которая выполняла некоторые базовые числовые вычисления, и когда она работала, у меня было множество экземпляров NumberAwareComparator:

(0..length - 1).eachParallel { i ->
                def final h = [:]
                distHash[i] = h

                println("Calculating distances ")

                if (i + 1 < length - 1) {
                    ((i + 1)..length - 1).each {j ->
                        def d = distanceCalc.getDistance(paragraphs[i], paragraphs[j])
                        if (d < 0.25) {
                            h[j] = d
                        }
                    }
                }
            }

Как только я объявил тип для каждой переменной (как показано ниже), все компараторы пропали и были заменены на числа с плавающей запятой / ints

(0..length - 1).eachParallel { i ->
                final LinkedHashMap<Integer, Float> h = new LinkedHashMap<Integer, Float>()
                distHash[i] = h

                println("Calculating distances ")

                if (i + 1 < length - 1) {
                    ((i + 1)..length - 1).each {j ->
                        float d = distanceCalc.getDistance(paragraphs[i], paragraphs[j])
                        if (d < 0.25) {
                            h[j] = d
                        }
                    }
                }
            }

1 Ответ

1 голос
/ 10 октября 2011

Похоже, этот класс, вероятно, не имеет состояния (но вы должны подтвердить это, посмотрев на исходный код).Если это так, вы сможете безопасно заменить все эти экземпляры одним экземпляром.

Если это приложение Grails, вы можете сделать это, используя что-то вроде следующего в Bootstrap.groovy

def singleton = new NumberAwareComparator()

NumberAwareComparator.metaClass.constructor << { ->
    singleton
}

В качестве альтернативы вы можете поместить приведенный выше код в закрытие doWithDynamicMethods Grailsплагин.

Если это не приложение Grails, вы можете использовать DelegatingMetaClass

...