2015-03-03 3 views
1

Явное приложение, которое я создал, по-видимому, использует разделяемую память, что мешает развертыванию других программ в среде unix клиента.Предотвращение использования общей памяти

Это никогда не было целью использовать какую-либо общую память, и мне нужно определить, где она потребляется.


Обзор программы:

-генерической исполняемая банка, который будет читать конфигурационный файл, выполняет сценарий командной строки UNIX и вывешивает в entirity выхода на службу REST размещенной в другом месте. Это повторяется каждый час (он следит за состоянием окружающей среды)

-Теперь существуют 3 отдельных экземпляра банки, работающих одновременно, но чтение различных конфигурационных файлов. Ни при каких обстоятельствах они не делятся ни с файлами, а файлы журнала, которые они создают, являются отдельными.

-Все буферизованные считыватели, InputStreams и т. Д. Открыты и закрыты соответствующим образом.


После запуска программы проверьте его presense в общей памяти greping их идентификаторы процессов в ИНКОМ -a, где все они перечислены.

Есть ли какие-либо предупреждающие знаки, вспыхивающие людьми, знакомыми с IPC и java? Есть ли какой-либо вариант выполнения, который я могу использовать для предотвращения использования общей памяти?

Приветствия

Edit:

@Aaron - Там нет ошибок, но когда другие программы развернуты на окружающую среду, они проверяют для процессов, использующих общую память. Если есть процесс, он остановит развертывание. Там должна быть причина для этого чека, но я не знаю ...

+1

Почему это мешает другим программам? Вы получаете ошибки? Или это более «О, что-то кажется странным ... что-то с этим поделать!»? –

+0

Общая память поставляется в разных вариантах и ​​используется повсеместно всеми программами Unix. Пожалуйста, укажите, что вы считаете аномальным поведением. Я подозреваю, что вы просто видите либо общий пейджинг обычного исполняемого кода (автоматический), либо страницы, общие для потоков в одной JVM. – chrylis

+0

Какая версия JVM (+ версия)? Включена ли удаленная отладка? Как насчет JMX? Вы загружаете собственный код? Используете ли вы какие-либо библиотеки/фреймворки, которые могут загружать собственный код? –

ответ

1

Я могу думать о нескольких возможных объяснений:

  • Очевидно, что если вы запустите JVM с -XX : включено UseLargePages, виртуальная машина использует общую память: см Cannot create JVM with -XX:+UseLargePages enabled

  • Если два JVMs открыть MemoryMappedByteBuffer на тот же файл, они эффективно используют общую память: см Java NIO - Memory mapped files

  • можно также т o написать собственные библиотеки JNI, которые используют shmat и т. д. для создания разделяемых сегментов памяти. Одна из ваших сторонних библиотек Java-приложений могла бы сделать это за кулисами.


О том, как найти виновника, возможно, вы должны попробовать запустить java под strace. Этот блог расскажет вам, как:

Однако, переходя от необработанных следов до определенного диагноза может не легко.


Когда другие программы развернуты на окружающую среду, они проверяют для процессов, использующих общую память. Если есть процесс, он остановит развертывание. Должна быть причина для этой проверки, но я не знаю ...

Это может быть защита от подрывной проверки лицензии на некоторые приложения ... или что-то в этом роде. Я был бы склонен говорить с поставщиками/поставщиками этих программ, чтобы выяснить, почему их программное обеспечение терпит неудачу. Спросите у них < < для приемлемого обходного пути, чтобы получить код для совместного использования с Java и/или вашим Java-приложением.

+0

Много еды для размышлений там Стивен, спасибо. Я уже разговариваю с продавцами, чтобы разобраться в работе. Я просто хотел исследовать любое решение в конце проблемы заранее :) – Roro

Смежные вопросы