Как выполняются теги CFX в Coldfusion 8?

В моей компании в последнее время у нас возникли проблемы с памятью. Одна вещь, которую мы сделали, это увеличение размера кучи в JRUN, но теперь мы замечаем некоторые побочные эффекты.

Одним из них является тег CFX, который обрабатывает изображения. Когда мы используем его, он не может загрузить файлы, которые мы иногда даем. Наша текущая идея заключается в том, что для обработки изображений все изображение должно быть загружено в память. Кажется, только выдает ошибки на больших файлах, которые занимают 200+ МБ памяти для хранения всего этого.

Что я хочу знать, так это то, как Coldfusion управляет загрузкой и выполнением CFX-тегов. Поскольку тег CFX, в частности, был написан на C++, я бы подумал, что он не обязательно будет использовать кучу Coldfusion (так как он хранит только данные Java), и мы не видим пиков кучи, когда что-то обрабатываем.

Я предполагаю, что главный вопрос заключается в том, как выполняется CFX: он работает как поток под JRUN, или создается собственный процесс Windows, который выполняется в своем собственном пользовательском пространстве? И, если он работает под JRUN, какое пространство памяти это использует при выполнении, и есть ли способ его контролировать?

2 ответа

CFX определенно работает как поток под JRUN, и данные передаются из Java в C++ через уровень JNI. Так что да, он загрузит все изображение в кучу, используя файл open/read по умолчанию (под обложками), а затем передаст двоичный файл в тэг C++. На мой взгляд, обработка больших файлов изображений (или больших файлов в целом) всегда была проблемой с CF. Есть некоторые "чистые Java" решения для обработки изображений, которые обеспечат более высокую производительность - или вы можете использовать что-то вроде "imagemagik", который передает имя файла и путь к оболочке и выполняется отдельно. Это мое мнение.

Я думаю, что если вы запускаете 32-битный процесс, он может получить доступ только к 2gig. Если куча составляет 1 гигабайт, то объем памяти без кучи будет 60-200+ мегабайт, а затем добавьте память для каждого потока, в котором выполняется процесс (и количество потоков становится еще выше, когда вы кластеризуетесь), тогда иногда нет Так много памяти осталось в вашем процессе. Кроме того, насколько я понимаю, различные библиотеки DLL отображаются в вашем пространстве памяти где-то в верхней части диапазона памяти, что означает, что когда ваш тег обработки изображений пытается выделить очень большой блок непрерывной памяти (я думаю, вне кучи) Для этого не осталось ни одного блока. Этот ответ несколько спекулятивен, поэтому не принимайте его за Евангелие, но, возможно, стоит взглянуть на программы, которые могут визуализировать карту памяти процессов.

Другие вопросы по тегам