ОК, вот что я и сделал, чтобы отследить основную причину.Дампы кучи показывали мне, что coldfusion.util.Key.keys
держал множество объектов в ConcurrentHashMap
типа coldfusion.util.Key
после того, как я некоторое время запускал нагрузочный тест.Поэтому я выяснил, какой .jar содержит .class - /lib/cfusion.jar - и декомпилировал его, чтобы увидеть источник.Я видел, что он хранит эти ссылки в статическом закрытом поле, ключи которого никогда не удаляются.
По сути, этот объект создается каждый раз, когда ключ, никогда ранее не использовавшийся, вставляется в структуру.Так что он вызывается со всех приложений ColdFusion.Я считаю, что цель состоит в том, чтобы ускорить поиск, невосприимчивость к регистру и сравнение.
Признавая, что я не могу изменить код, чтобы исправить проблему, поскольку я уверен, что при использовании в производственной среде это нарушит лицензионное соглашение, я изменил код, чтобы помочь мне понять, почему так много объектовсоздано в первую очередь.В основном я добавил следующее в конструктор:
try {
throw new RuntimeException();
} catch (Exception e) {
e.printStackTrace(System.out);
}
Затем я скомпилировал и поместил измененный класс в cfusion.jar.
К счастью, генерируемая трассировка стека включает имена файлов .cfm и номера строк.Я запустил CF из командной строки (т.е. jrun.exe -start coldfusion), чтобы я мог легко увидеть, что происходит с System.out, а затем снова запустил свой нагрузочный тест.Таким образом, эвристик находил, какой код называл этот много и, возможно, изменял это.
Это позволило мне быстро увидеть файл .cfm, который вызывался при каждом запросе.Таким образом, я могу изменить этот файл, чтобы он больше не создавал структурные ключи, и это привело к гораздо более длительной работе виртуальной машины.Это не решает проблему полностью, но значительно снижает потребление памяти.