2012-05-18 5 views
1

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

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

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

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

ответ

1

CFX определенно работает как поток под JRUN, и данные распределяются с Java на C++ через уровень JNI. Так что да, он загрузит все изображение в кучу, используя файл по умолчанию для открытия/чтения (под обложками), а затем передаст двоичный код вашему тегу C++. Обращение с большими файлами изображений (или большими файлами в целом) всегда было проблемой с CF на мой взгляд. Существуют некоторые «чистые Java» решения для обработки изображений, которые обеспечат лучшую производительность, или вы можете использовать что-то вроде «imagemagik», которое передает имя файла и путь к оболочке, а -, выполненный отдельно. Это мое занятие.

+0

благодарит за ответ. если эти данные загружаются в кучу, почему мы не видим всплески в использовании кучи при мониторинге с помощью jconsole или visualvm? – jzimmerman2011

+0

Я не уверен ... может быть, сообщение? jconsole сообщает об объектах, которые обозначены как короткие (eden) или long (tenured). Этот объект создается до полного его чтения, а затем он исчезает довольно быстро ... но я не уверен, где он живет. Я знаю только, что это проблема, с которой мы сражались на протяжении многих лет. файловые операции для больших файлов в CF всегда были iffy. –

+0

круто, спасибо за информацию. мы не увидели эти всплывающие окна, пока мы не увеличили кучу (сейчас сидит на 1 ГБ), поэтому нам было интересно, загружены ли эти вещи за пределы кучи холода. если бы это было так, тогда было бы разумно, поскольку куча занимала больше памяти, которая время от времени использовалась для загрузки этих изображений. – jzimmerman2011

1

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

+0

спасибо за ответ. В настоящее время мы используем visualvm и jconsole для просмотра внутри jvm, но когда мы используем тег cfx (независимо от того, успешно или неудачно), мы не видим всплесков в использовании памяти, поэтому мне кажется, что этот материал запускается вне jvm. есть ли у вас какие-либо инструменты, чтобы рекомендовать для этого? – jzimmerman2011