| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Совместное использование памяти двумя приложениями |
| Автор: Prol 11.1.2008, 08:13 | ||||
| Как сделать так, чтобы данные объектов были в одном приложении, а их методы выполнялись в другом приложении? Аналогично механизму share memory во FreeBSD... Например, в запущенном приложении Keeper есть объект
В запущенном приложении Utilizateur происходят операции с объектом.
Приложение Utilizateur использует методы и оперирует над данными объекта point59 в другом приложении Keeper. Это нужно для того, чтобы если Utilizateur попытается чего-то сделать неправильно, например завалится от деления на ноль, то Keeper будет продолжать работу, сохранив все данные. Как это сделать? Заранее признателен за подсказку в направлении, куда копать... |
| Автор: jManiak 11.1.2008, 08:18 |
| http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp? |
| Автор: Prol 11.1.2008, 08:24 |
| http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp? RMI сериализует/десериализует объекты, и фактически Utilizateur будет оперировать своим point59. А нужно, чтобы Utilizateur оперировал объектом point59, который принадлежит приложению Keeper. |
| Автор: Prol 11.1.2008, 08:42 |
| Например, на одной JVM на одном хосте выполняются два приложения. Может ли одно приложение получить прямой доступ к объектам другого приложения и оперировать с ними, как со своими объектами в пределах одной JVM? |
| Автор: Prol 11.1.2008, 11:55 | ||
Речь идёт не о хранении общих данных. Для этого достаточно СУБД. Но СУБД не хранит методы объектов, насколько я знаю, методы не сериализуются. Смысл shared memory в данном случае в том, что выход из строя приложения Utilizateur не приведёт к потере данных, которые находятся в работающем приложении Keeper. Ведь приложение Utilizateur использует не свои объекты, а объекты (методы и данные) Keeper'a. Вот например в SAP JVM сделано так, что разные приложения могут помещать объекты в shared memory и совместно использовать эти объекты. |
| Автор: LSD 11.1.2008, 12:05 | ||
Можно сделать через MappedByteBuffer (правда работать с ним не удобно):
|
| Автор: Prol 11.1.2008, 12:20 |
| LSD, шарить нужно не данные, а объекты :о) Из вашего кода я не понял, как Утилизатор сможет пользоваться объектами Кипера. |
| Автор: Prol 11.1.2008, 12:42 |
| Попробую переформулировать на живом работающем примере на С. Запускаю: prol@corphangar> CorporationApplication -Keeper Приложение запускается, распределяет память и остаётся в режиме кипера, ничего не делает. Запускаю вторую копию этого же приложения prol@corphangar> CorporationApplication -Utilizateur С помощью механизма shm второе приложение работает над данными первого приложения с помощью функций первого приложения, в том числе делает new и dispose, новые объекты создаются и удаляются в общей shared memory, и первое приложение, которое ничего не делает в sleep'e, при этом владеет всеми новыми объектами. Так как первое приложение ничего не делает, то оно и не падает. А вот если второе приложение свалится по какой-либо причине, то в первом приложении останутся все данные целыми. :о) Как сделать такое на Java? Чтобы второе приложение использовало объекты первого приложения? |
| Автор: LSD 11.1.2008, 12:43 |
| Объекты шарить между разными JVM - нельзя (во всяком случае стандартные реализации этого не позволяют). |
| Автор: Prol 11.1.2008, 12:51 | ||
А можно ли шарить объекты между приложениями внутри одной JVM? |
| Автор: LSD 11.1.2008, 12:59 |
Да, только они должны использовать один и тот же класс лоадер. |
| Автор: Prol 11.1.2008, 13:25 | ||
Извините, я ещё не владею достеменно понятиями Java, поэтому объясните, как в одной JVM могут быть разные класслоадеры. И пожалуйста, приведите пример, как два приложения могут пользоваться одним объектом в одной JVM в виде кусочка кода... |
| Автор: LSD 11.1.2008, 13:36 | ||||||
Очень даже запросто, если это какой-то J2EE сервер, то они даже будут разными. Но в обычном приложении он как правило один.
Да обычный синглетон например:
все потоки используют один и тот же экземпляр Runtime. |
| Автор: Prol 11.1.2008, 13:42 | ||||||
Как самому сделать такой "синглетон", одни объект, который могут использовать одновременно два моих приложения? |
| Автор: seth 11.1.2008, 14:33 |
| а с помощью JNDI не получится? |
| Автор: Prol 11.1.2008, 14:41 | ||
JNDI хранит сериализованные объекты (как я понял, методы не сериализуются). Но я веду речь не о том, как хранить совместно используемые данные (свойства объектов), а как использовать один и тот же объект из разных приложений одновременно :о) |
| Автор: batigoal 11.1.2008, 14:55 | ||||
С помощью статической переменной:
|
| Автор: Prol 11.1.2008, 15:03 | ||||||
Дык оно же будет создавать новый синглтон для каждого приложения, которое пользуется им :о) А как сделать синглтон, который создан одним приложением и виден из другого приложения, которое в это время запущено одновременно с приложением, которое создало синглтон? |
| Автор: batigoal 11.1.2008, 15:06 | ||
Нет, если класс для обоих приложений будет загружен одним и тем же загрузчиком классов. |
| Автор: Prol 11.1.2008, 15:18 | ||||
Но ведь в одной JVM один загрузчик классов? То есть если я сейчас запущу приложение c вашим синглтоном, то второе запущенное приложение его увидит и не будет делать new? |
| Автор: Maksym 11.1.2008, 15:35 |
| Prol Ты не создаешь новый экземпляр через new в этом случае, а получешь единственный через MySingleton.getInstance() -- в это суть паттерна: используется только один экземпляр класса, который хранится в статике. |
| Автор: Prol 11.1.2008, 15:59 | ||||
Извините, я новик, у меня не получается сделать приложение с вашим синглтоном :о(
|
| Автор: batigoal 11.1.2008, 16:10 |
| Это просто предупреждение, что объявленная переменная, в общем-то, не нужна. Оно не препятствует выполнению программы. |
| Автор: COVD 11.1.2008, 17:29 |
| Prol, вы явно хотите использовать java не по назначению, т.е. преодолеть существующие защитные механизмы java, используемые для повышения надежности программ. Идея сделать на java как на C - не продуктивна. Если работа с данными происходит в отдельном потоке и происходит деление на ноль, то выбрасывается исключение и этот поток может спокойно умереть. Если этот поток не модифицировал данные, то данные будут в сохранности и приложение продолжает функционировать. |
| Автор: tux 11.1.2008, 20:24 |
Нет, не один. |
| Автор: Stampede 11.1.2008, 20:42 | ||
А откуда такая увереность, что приложение-утилизатор, свалившись, не оставит после себя полную абракадабру в приложении-хранителе? Это, я вам скажу, более чем зыбкая посылка. Поэтому предлагаю не шифроваться, а изложить задачу в более исходном виде, не замкнутом на детали реализации. Возможно, совместными усилиями отыщется и более адекватное решение. |
| Автор: Prol 11.1.2008, 22:16 | ||
Не оставит, потому что снимать его будет ОС за оперейшен эксепшен или другое подобное. Точнее, если второе приложение оставило белиберду, то и первое в этом же месте оставило бы точно такую же белиберду :о) Первое и второе приложение совершенно одинаковы. А значит надо править неправильный код приложения. Но вот в случае исключительных ситуаций, связанных с вводом-выводом, делением на ноль или подобным, данные сохраняют целостность, а ОС убивает виновника, то есть второе приложение, сохранив при этом работающее первое, которое мне присылает смс, я смотрю, почему ОС убила второе приложение, если исправления в коде не требуются, то перезапускаю второе приложение, которое опять подхватывает shared memory, находящуюся в первом приложении и работает :о) |
| Автор: intr 12.1.2008, 06:27 |
| RMI или ему подобное. Другие варианты извращение... |
| Автор: Prol 12.1.2008, 06:46 | ||
Как вы себе представляете работу RMI с тремя миллионами объектов? Сколько будет длиться сериализация/десериализация трёх миллионов объектов? А у меня уже несколько лет работают реалтайм приложения на С по схеме с шаред мемори. Одно держит методы и данные, а второе использует методы и данные первого приложения прямо в памяти. Когда второе приложение падает, первое продолжает работать, и сохранять данные тысяч пользователей. Если вы скажете, что в Java такое невозможно, то я вам приведу в пример SAP JVM, которая позволяет шарить объекты прямо в памяти между несколькими JVM. |
| Автор: intr 12.1.2008, 06:57 | ||||
1. Зачем нужна сериализация/десериализация трех миллионов объектов. Это равносильно выгрузке 4 гиговой БД в ОЗУ! 2. Судя по проблеме надо шарить методы для других приложений, а не три миллиона объектов 3. Приложение которое сохраняет объекты это обычно БД! Вопросы: 1. Вы пишете свою базу данных? 2. Для каких целей нужна сериализация/десериализация трех миллионов объектов? 3. Вы держите в ОЗУ три миллиона объектов? p/s Такое ощущение что архитектура приложения очень сильно хромает! |
| Автор: Prol 12.1.2008, 07:01 | ||||
Потому что RMI сериализует/десериализует объекты между приложениями. Добавлено через 1 минуту и 52 секунды
Шаман! |
| Автор: intr 12.1.2008, 07:07 | ||||
Ключевое слово здесь три миллиона объектов, зачем так много передавать? |
| Автор: Prol 12.1.2008, 07:08 | ||||
Больше... :о) Это риалтаймовые объекты, свойства которых обновляются от контроллеров, которые присылают данные с датчиков... Их нельзя не держать в памяти, потому что моё приложение обязано откликнуться на любое событие не позднее, чем через восемь миллисекунд. Дропать события тоже нельзя, за это тюрьма. Добавлено через 13 минут и 5 секунд
Чтобы при снятии системой одного из приложений, другое сохранило доступ ко _всем_ объектам, с которыми они работали, и возобновило работу. |
| Автор: intr 12.1.2008, 07:28 |
| В данном случае я бы использовал очень быстрый сервер БД (на очень быстром железе), возможно Oracle... ИМХО Java не очень подходить для систем реального времени, по крайней мере с использованием стандартной Java машины от SUN. p/s А что делать с данными в ОЗУ если даст сбой железо или выключат свет? тюрьма? можно не отвечать |
| Автор: Prol 12.1.2008, 07:45 | ||||
:о))) Почему же? Байткод Java ненамного уступает ассемблеру по скорости выполнения, но писать на нём намного легче. Кроме того, у Java отличная переносимость. То, что у SUN ещё нету шаред мемори - это вопрос времени и требований разработчиков... Добавлено через 1 минуту и 9 секунд
За сбой питания я не отвечаю :о) Пусть хоть там все передеруцца... |
| Автор: tux 12.1.2008, 08:15 | ||
А каким образом вы решили проблему со сборщиком мусора в Sun JVM? Его работа может занять гораздо больше 8 миллисекунд, причем в неопределенные моменты времени. |
| Автор: Prol 12.1.2008, 08:23 | ||
Мои приложения на С. Я хочу их портануть на Java, потому что мне так кажется удобнее передать моему наследнику и уйти на пенсию. :о) На Питон тоже можно, но если эти охламоны видят в операторе (_*_) разорванную жопу, а не умножение предыдущего выражение самого на себя (возведение в квадрат), то уж пусть лучше пишут на Java... |
| Автор: tux 12.1.2008, 08:27 | ||
Боюсь это плохо кончится для наследника. Сборщик мусора - это как раз одна из тех причин, по которой обычные JVM не используются в приложениях реального времени. Есть спецификация Real-time Java, начать можно отсюда - http://en.wikipedia.org/wiki/Real_time_Java. |
| Автор: Prol 12.1.2008, 08:35 | ||
Я знаком с нею - она дропает входящие события, типа я не видела того, на что не успеваю отвечать. Поэтому я и спросил про шаред мемори - проверенный механизм. |
| Автор: tux 12.1.2008, 08:56 |
| Мне как-то не совсем понятен разговор про shared memory, рецепт которой, кстати, уже предложили - синглтон, но с ограничениями по загрузке классов о которой я говорил, если сама Java не подходит под задачу. Или таки 8 миллисекунд - это не жесткое ограничение? |
| Автор: batigoal 12.1.2008, 12:27 | ||
Насколько я знаю, этим можно управлять. |
| Автор: Maksym 12.1.2008, 15:30 |
| Prol Возможно я пропустил.. А в каком окружении работает ваше приложение (ОС, железо)? И куда физически приходит инфомация с датчиков (порты)? Интересно. Если не секрет. ЗЫ. Насколько я знаю, для реалтаймовых систем используются заточенные под это дело операционный системы, типа http://en.wikipedia.org/wiki/QNX. |
| Автор: serger 14.1.2008, 09:01 |
| Ну вы развели!.. Надо начать с описания задания. Что нужно сделать конкретно. А то завели спор, как микроскопом гвозди забивать.. Теоретические споры тоже умесны, но до определённого предела. Вроде он уже достигнут. Нужны факты. ps. Построить можно что угодно, но насколько рационально. |
| Автор: Prol 14.1.2008, 09:34 | ||||
FreeBSD 4.12 Железо нормальное :о) Данные приходят на сетевой порт :о) Трафик порядка терабайта в месяц :о) Добавлено через 2 минуты и 50 секунд
Не имеет значения, что делает приложение. Я описал работающий метод защиты от сбоев приложения с использованием механизма shared memory и спросил, возможно ли сделать такое не для приложения на С, а для приложения на Java ? |
| Автор: powerOn 14.1.2008, 10:02 |
| По поводу расшаривания объектов, есть предложение посмотреть в сторону JMX (http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/). Я с этой технологией не работал, но на сколько знаю, она позволяет одной JVM подключиться к другой и, грубо говоря, дернуть метод у объекта. В целом JMX создавалась как средство мониторинга Java приложений. |
| Автор: serger 14.1.2008, 10:20 | ||
Банальный вопрос а зачем? Ещё хуже. Зачем делать так же как на с? Язык определяет мышление. Нельзя на одном писать средствами другого. Я считаю, с таким подходом, даже если что-то и получится, то будет держаться только на Вашем интузиазме. А приемнику Вы окажите медвежью услугу. |
| Автор: w1nd 14.1.2008, 10:21 | ||
Как средство управления с универсальным интерфейсом. |
| Автор: serger 14.1.2008, 10:47 |
| http://voituk.kiev.ua/2007/11/08/jmx-hello-world/ |
| Автор: serger 14.1.2008, 11:39 |
| около 400к данных в секунду приходит? |
| Автор: Prol 14.1.2008, 22:30 | ||||||
Это суммарный входящий/исходящий. Пропорция примерно 100к входящего на 300к исходящего от приложения в секунду. Добавлено через 11 минут и 40 секунд
Как зачем? Затем, чтобы обеспечить сохранность данных, разделяемых двумя приложениями, при любых практически сбоях одного из приложений. :о) |
| Автор: powerOn 14.1.2008, 23:46 | ||||
Большинство из БД могут удовлетворить этим требованиям. Например Apache Derby (Java DB) прекрастно с этим справится. Просто настройте 2 приложения работать с одной БД. Более того, при работе с БД, вы имеете возможность сохранить данные даже при крахе обоих приложений. Хотя, честное слово, ума не приложу, в чем может быть причина, что одно из приложений упадет... |
| Автор: batigoal 15.1.2008, 00:11 | ||
Ну как раз тут-то у меня сомнений нет, redundancy обеспечивать нужно. Вот только что толку от двух экземпляров программ, запущенных на одной машине, мне неясно. Умрет диск - и до свиданья. Так что лучше обеспечивать беперебойность кластеризацией (базы, или application-серверов, или каких-то самописных программ). |
| Автор: COVD 15.1.2008, 00:39 | ||||
праивильный ответ
|
| Автор: Prol 15.1.2008, 02:10 | ||
| Ок, я понял, что не могу доходчиво донести. Попробую по другому. Фаза инициализации более трёх миллионов объектов в памяти занимает более 15 минут. Они читаются из БД и размещаются в памяти одним приложением. В случае, если ОС снимет это приложение, то время повторного перезапуска займёт те же более 15 минут, каковое время недопустимо по требованию заказчика. Поэтому я запускаю две копии одного приложения. Первая копия при первом старте тратит 15 минут на чтение и размещение объектов в shared memory памяти и падает в sleep. После того, как я вижу, что первое приложение отинитилось, то запускаю вторую копию этого же приложения. Поскольку оба приложения используют shared memory, то второе приложение (оно точно такое же по коду как и первое) получает уже отиниченную память со всеми тремя миллионами объектами и приступает к отработке очереди сообщений всего за одну секунду. В случае сбоя в приложении, ОС снимает именно то приложение, в контексте которого произошёл сбой, то есть второе, потому что именно оно что-то делает, а первое остаётся в слипе, сохраня всю память со всеми тремя миллионами объектов в текущем состоянии обработки. Рестартовав второе приложение за одну секунду, оно продолжает работать, откатив последнюю транзакцию. Можно ли так сделать на Java? Добавлено через 3 минуты и 32 секунды
Если умрёт диск (это тоже неважно, потому что диск не используется), ОС снимет второе приложение по сбою ввода-вывода, но первое приложение останется в памяти и сохранит все данные :о) |
| Автор: Prol 15.1.2008, 02:38 | ||
Грубо говоря, можно ли примерно так? :
|
| Автор: intr 15.1.2008, 04:26 |
| Дальше небольшой Помню пришлось дорабатывать код написанный бывшими PHPшниками, это был их первый большой проект на Java. Таких извращений в коде я больше никогда не видел p/s а оно надо переписывать с си на Java? Ведь работает и устраивает заказчика. А если код стабилен то проще найти нормального сишника! p/s/s А сборка мусора это действительно большие грабли для реалтаймовых систем |
| Автор: serger 15.1.2008, 06:20 | ||
А может ли волк понять овцу? И может ли овца стать волком? Задачи надо решать средствами языка, иначе будет.. ну что-то на 5 точке ;) Те я хочу сказать, что простой переделкой кода тут не обойдёшься. Надо переделывать архитектуру системы с точки зрения java и как это на java делается. Готовы Вы на это пойти, или нет - это Вам решать. Ну и есть принцип. Работает, не трожь! |
| Автор: Prol 15.1.2008, 06:32 | ||||
Не такие уж и большие грабли - этот garbage collector. По крайней мере его можно заставить убирать мусор не когда ему требуется, а когда нам требуется.
|
| Автор: serger 15.1.2008, 07:14 |
| это не так Это лишь уведомление о необходимости - jvm САМА решает когда запускать. |
| Автор: Prol 15.1.2008, 07:29 | ||||
gc() - принудительный вызов сборщика мусора. Когда управление выходит из вызванного gc(), мусор уже убран.
|
| Автор: batigoal 15.1.2008, 09:38 |
| Prol, это ошибка. Вызов сборщика мусора не гарантирован ВАЩЕ. Кое-как им можно управлять с помощью ключей запуска JVM, но это весьма ограниченное управление. Раньше еще использовался такой прием - вызов gc() несколько раз подряд. Сейчас даже он уже не прокатывает. |
| Автор: serger 15.1.2008, 09:53 | ||
| да даже если бы и срабатывал сразу, к чему это приводило бы? Вот тут сайт про JVM. http://blogs.sun.com/vmrobot/category/GC или вот есть такие шаманства (http://www.piter.com/lib/978588782218/java.phtml?fil=14): Следующий метод освобождает всю возможную память:
|
| Автор: Prol 15.1.2008, 14:03 | ||
Что значит "ошибка"? В одном из базовых классов Java ошибка? Его нельзя вызывать несколько раз подряд, это асинхронное событие имеющее длительно время исполнения. Сборщик мусора нужно вызывать не в основном потоке приложения, а делать для него отдельный поток и пользоваться как при асинхронном вводе-выводе, наверна, да? :о) |
| Автор: intr 15.1.2008, 14:24 |
| Вообщем пообщался с одним умным человеком gc() не просто удалят все неиспользуемые объекты из памяти он при вызове решает стоит удалять объекты из пямяти или нет на основе времени жизни объекта, количества свободной (занятой) ОЗУ и т.д. то есть он попробует почистить память Так по крайней мере в стандартной Java машине p/s Кстати если нужен нормальный runtaime и адекватное время исполнение, то скорее всего надо использовать специальное железо от SUN и специальную сборку Java машины. Но стандартная сборка Java машины для этого точно не подходит! Но это ИМХО. |
| Автор: batigoal 15.1.2008, 14:37 | ||||||
Что значит "нельзя"? Можно. Но исполняться оно будет долго. Ошибка заложена уже в самой идее - управлять памятью в managed-языке. Приложение не может управлять своей выполняющей средой, оно может лишь рекомендовать ей что-то сделать, что и подтвержадется приведенным куском доки:
Зачем? В том же фрагменте написано:
Рекомендую почитать статьи по тюнингу сборщика мусора, в Интернете их немало. Добавлено через 1 минуту и 21 секунду
Для этого и создана Real-Time Java. |
| Автор: intr 15.1.2008, 15:06 |
| Вообщем пообщался с одним умным человеком gc() не просто удалят все неиспользуемые объекты из памяти он при вызове решает стоит удалять объекты из пямяти или нет на основе времени жизни объекта, количества свободной (занятой) ОЗУ и т.д. то есть он попробует почистить память Так по крайней мере в стандартной Java машине p/s Кстати если нужен нормальный runtaime и адекватное время исполнение, то скорее всего надо использовать специальное железо от SUN и специальную сборку Java машины. Но стандартная сборка Java машины для этого точно не подходит! Но это ИМХО. |
| Автор: Prol 15.1.2008, 15:32 |
| Мы отвлеклись от темы. :о) Как обратиться к объекту (экземпляру класса), находящемуся в другом приложении? |
| Автор: AntonSaburov 15.1.2008, 16:00 | ||
Я бы тогда пошел по другому пути - повышение надежности и отказоустойчивости. Например запускаем Application Server у которого работает два приложения - одно хранит данные в некотором кэше (хранилище), другое (логика) - выполняет какие-либо действия с этими данными. Падение Application Server - ну надо очень постараться. Даже если при выполнении логики что-то отвалится, то хранилище должно (и будет) нормально работать. Сервер просто подымет еще одну копию логики. И все. Хотя инициализация трех миллионов объектов - это как-то странно. |
| Автор: w1nd 15.1.2008, 21:08 | ||
Вам уже ответили - никак. Связь только через файл, отображаемый на память или сокеты (или любой другой более высокоуровневый механизм). |
| Автор: ecologist 16.1.2008, 08:42 |
| Ну вообщем-то никто не мешает исполmзовать RMI или просто сокеты для общения приложений. Но правда в таком случае эффективность работы наверняка снизится. Если же иметь в виду общую память, которую можно разделять между процессами, то это особенности ОС и кроссплатформенность JAVA на такие вещи не рассчитана. Я бы тоже задумался (как и AntonSaburov) над проектированием системы. |
| Автор: Prol 16.1.2008, 09:09 | ||||
Что подразумевается под "Хранилищем"? Образ памяти или БД? Application Server предоставляет доступ двум приложениям к одной памяти? Добавлено через 2 минуты и 17 секунд
Как сделать в Java связь через файл, отображаемый на память? |
| Автор: batigoal 16.1.2008, 10:09 | ||
Нет, но он может объединять несколько серверов в кластер, обеспечивая тем самым отказоустойчивость. |
| Автор: w1nd 16.1.2008, 11:26 | ||
В этой теме об этом уже говорили - http://forum.vingrad.ru/index.php?showtopic=190848&view=findpost&p=1376155. |
| Автор: Prol 16.1.2008, 11:31 | ||
Спасибо, но в этот файл невозможно загрузить методы и передать им управление :о( |
| Автор: w1nd 16.1.2008, 12:39 | ||
Как и в любой другой файл. Но в этом нет и смысла - вам же нужно разделять данные, а не методы. |
| Автор: Prol 16.1.2008, 13:20 | ||||
Именно необходимо разделять методы :о) Мне не нужны два разных приложения, у которых каждого свой new и свой код методов. Мне нужно, чтобы два одинаковых приложения разделяли один new в одной области памяти и использовали одну копию методов над одной копией объектов. |
| Автор: AntonSaburov 16.1.2008, 13:42 | ||
А если упадет именно в таком методе, то какая тут надежность ? Проблема как я понимаю в том, чтобы иметь надежное приложение, которое данные позволяет сохранить в случае падения логики. Но тогда надо разделять данные и логику. Ощущение, что Вы не очень понимаете, что надо. Это не сомнение в профессионализме - просто может пока задача не совсем очевидна. |
| Автор: Prol 16.1.2008, 13:49 | ||
Так упадёт же второе приложение. А первое сохранит все данные уже размещённые в памяти. И тогда нужно будет перезапустить второе приложение, которое продолжит работу с откатом последней транзакции. :о) |
| Автор: AntonSaburov 16.1.2008, 13:55 | ||
Но в таком случае логика и данные разделены. И второе приложение просто проверяет - не упало ли первое. И в нужный момент подхватывает. Значит именно данные лежат в shared memory. А все методы - в логике. Или классов тоже три миллиона ? Вы случайно не введены в заблужение по поводу того, что методы создаются для каждого объекта ? Это не так - один метод работает для всех объектов этого класса. Добавлено через 8 минут и 20 секунд Похоже я что-то понимаю - логика работает в объектах и меняет их состояние. Надо каким-то образом это состояние хранить. А т.к. перемешана логика с данными в объектах, то точно разделить не получается. Значит нужен механизм, которые постоянно сохраняет значения полей объектов где-то. Что конечно же усложнит работу и снизит производительность. Либо сделать разделение на объекты, которые зранят данные и объекты, которые их изменяют. В терминах EnterpriseJavaBeans это EntityBean и SessionBean. Видимо так и надо проектировать. |
| Автор: Prol 16.1.2008, 14:16 | ||
Ок, попробую ещё раз объяснить. ОС убивает то приложение, в контексте которого произошла ошибка. И освобождает память убитого. Но если приложение пользуется памятью другого приложения, то ОС не освобождает память непричастного. Посмотрите картинку, как оно сделано на С. Можно ли так сделать на Java? |
| Автор: LSD 16.1.2008, 14:20 |
| Нафига код методов помещать в общую память? У вас что, приложение само себя модифицирует в процессе работы? |
| Автор: Prol 16.1.2008, 14:22 | ||
Методы и объекты всегда разделены :о) Методы ведь общие для всего класса объектов. Смысл в том, что второе приложение пользуется методами и объектами первого приложения, но в случае сбоя ОС снимает именно второе приложение :о) А первое сохраняет загруженными и методы и объекты. |
| Автор: LSD 16.1.2008, 14:22 | ||
На Java тако практически не реально, байткод не может вызвать крах JVM. Сам упасть - сколько угодно, но свалить JVM без использования native методов не реально (ошибки в самой JVM редки). |
| Автор: Prol 16.1.2008, 14:23 | ||||
Для того, чтобы второе приложение могло вызвать методы, которые лежат в общей памяти :о) Добавлено через 1 минуту и 30 секунд
Подставьте вместо ОС слово JVM. Как сделать, чтобы второе приложение вызывало методы первого над объектами первого? |
| Автор: LSD 16.1.2008, 14:29 | ||||
И что? Что тебе мешает дать ему свою копию классов? Добавлено через 1 минуту и 39 секунд Да и зачем ему что-то там вызывать, если он как ты говоришь используется только для того, чтобы после падения данные остались в памяти. Добавлено через 3 минуты и 1 секунду
Если ты хочешь все делать внутри одной JVM, то варианты решения тебе уже неоднократно предлагали, повторять не буду. |
| Автор: Prol 16.1.2008, 14:42 | ||||||||||
Мне не нужна вторая копия тех же методов, во-первых. А во-вторых мой менеджер памяти должен быть в единственном экземпляре но доступен из обоих приложений для управления распределением общей разделяемой памяти для объектов.
Первое приложение не совсем спит, оно просто в это время делает непрерывный бекап в БД, не мешая второму работать с объектами. :о)
Извините, но RMI и JMX не подходит, потому что сериализует/десереализует объекты между приложениями. А мне нужно из второго приложения выполнять методы первого над объектами первого, и если JVM прибъёт второе приложение за шо-нибуть некорректное. то в первом остануться все методы и все объекты на момент последней незавершённой транзакции. |
| Автор: fixxer 16.1.2008, 14:43 |
| Prol, сколько можно тупить? (при всем уважении к возрасту и прочим регалиям). Вам уже неоднократно сказали, что Java это не C и то что прокатывает во втором не обязано работать также в первом. Мое мнение, что на Java Вам переходить не стоит. |
| Автор: Prol 16.1.2008, 14:46 | ||
Так что, даже если я откомпилю приложения Java в нативный код и они будут работать без JVM, то всё равно они не смогут пользоваться общей разделяемой памятью? ;о))) |
| Автор: fixxer 16.1.2008, 14:55 | ||||
Попробуйте ;) Добавлено через 2 минуты и 15 секунд
Непонятно, чем здесь помешает RMI? |
| Автор: Prol 16.1.2008, 15:00 | ||
| Я вот чё подумал... Может быть я недооцениваю потоки в Java? Например пусть в одном приложении у меня есть поток Keeper и поток Utilizateur, и в одном из них произошёл непоправивый сбой, то JVM мне остановит только поток-виновник сбоя или прибъёт всё приложение? Добавлено через 2 минуты и 51 секунду
Предстаьте себе, что вы меняете значения трёх миллионов объектов не напрямую, а используя сериализацию/десериализацию (RMI) :о) Насколько это будет медленнее? |
| Автор: LSD 16.1.2008, 15:06 | ||||
Только поток вызвывший сбой. Плюс ты можешь зарегистрировать своего обработчика на это событие. Добавлено через 5 минут и 16 секунд
Внутри одной JVM можно использовать статические поля/методы. |
| Автор: Prol 16.1.2008, 15:21 | ||||
Тогда это выход. Если сбой в одном потоке не вызывает снятия всего приложения исполняющей JVM, то я нашёл ответ на свой вопрос. Всем участникам спасибо за возню со мной, косноязычным :о) Теперь бы ещё понять, как отловить переполнение.... Но для этого я открыл другую тему. Ещё раз спасибо, ребята :о) |
| Автор: batigoal 16.1.2008, 16:00 | ||
Если сбой произошел по вине данных, то они успешно положат и второй поток. Если же, допустим, засбоит JVM, то приложение также умрёт. Поэтому я не понимаю смысл подобной избыточности - она не даёт особых прибылей. |
| Автор: Prol 16.1.2008, 16:04 | ||
Данные не могут положить поток. Поток может положить неправильный метод. Не положат они второй поток, потому что второй поток не делает с ними те же операции что и первый :о) Прибыль получается, что в случае сбоя второго потока, нам нужно его перезапустить на уже готовые, существующие объекты. А в случае однопоточного приложения нам придётся переиничивать все объекты, а это занимает бешеное время, в моём приложении 15 минут. |
| Автор: COVD 16.1.2008, 16:35 | ||
|
| Автор: LSD 16.1.2008, 17:19 |
А что помешает ему после перезапуска, на тех же самых данных снова лечь? |
| Автор: Prol 16.1.2008, 17:33 | ||
А он ведь не с того же места начнёт выполнение, а значит вызовет другой метод или тот же метод с другим объектом, так что может вообще повторной ошибки не произойти :о))) Грубо говоря, вот у нас любое оконное приложение состоит из трёх потоков. 1. UI 2. Внутренняя логика 3. Ввод-вывод всякий, кроме UI. В таком приложении нужно просто добавить поток Keeper, который всегда будет работать, ничего не делая, кроме ожидания остановки одного из первых трёх потоков по ошибке. В случае остановки одного из указанных потоков, Keeper его перезапускает. При этом данные приложения сохранятся. :о) |
| Автор: batigoal 16.1.2008, 17:43 |
что значит - неправильный метод? |
| Автор: Prol 16.1.2008, 17:49 | ||
неправильный метод, это такой метод, который делает не то, что написано в спецификации этого метода, например закоден с ошибкой в алгоритме, или кодер ошибся с приоритетом операций и скобки не там стоят... |
| Автор: batigoal 16.1.2008, 17:54 | ||
Так его надо переписывать, значит, а не в двух потоках запускать. А если у тебя есть два неправильных метода, и они выполнятся в двух потоках с интервалом, допустим, в три минуты? |
| Автор: serger 16.1.2008, 18:07 |
| to Prol, Вы какие ошибки имеите в виду? Какие данные? В двух словах, какой алгоритм? Просто опять грубо: Возникает у Вас ошибка деления на 0 в алгоритме, алгоритм завершается, как-либо? Ну допустим вылетает. Данные сохранились. И опять так же обрабатываются. Алгоритм опять вылетает.. Что дальше?! ps. Горе от ума?! |
| Автор: Prol 16.1.2008, 18:09 | ||||||
Значит я подготавливаю исправленный вариант, оцениваю, требуется ли перезапуск и пишу емерженси рекваест, в котором указываю причиной требования - мои ошибки в коде и несу его начальству, начальство снимает с меня премию месячную, аппрувит рикваест, я перезапускаю приложение внепланово. Добавлено через 3 минуты и 54 секунды
Ну ето не самая частая ошибка, в прошлом году три раза вылетала. Ничего страшного, перезапустился тут-же, а там другие проверки не пропустили до этого места, а потом корку копал, искал откуда он проскочил, етот делений на ноль. |
| Автор: serger 16.1.2008, 18:19 |
| Печально, но ничего не понял, кроме того, что лучше бы таких ошибок не возникало. Ну это и так понятно. Ну возникла идея. А почему бы тогда всё-таки данные и обработчик вообще разъединить? Чтобы перезапускать надо было только обработчик, если он сбоит? |
| Автор: Prol 16.1.2008, 18:24 | ||
Так я так и делаю сейчас. У меня Кипер и Утилизатор два разных приложения в контексте ОС. Кипер хранит данные и работает ну вот последний аптайм 170 суток. А Утилизатор с этими данными работает аптайм уже две недели со времени последнего перезапуска. |
| Автор: serger 16.1.2008, 18:29 |
| Ну дык, тогда я не понял.. Если алгоритм засбоит, Утилизатор быстро можно перезапустить?!.. |
| Автор: Prol 16.1.2008, 18:44 | ||
Утилизатор поднимается мгновенно - за одну секунду :о) |
| Автор: serger 16.1.2008, 18:47 |
| Не если его передеплоить придётся. Раз он за секунду поднимется, в чём проблема? |
| Автор: Prol 16.1.2008, 18:55 | ||
Без санкции руководства я не имею права запускать новые версии вне плановых перезапусков :о) Что непонятного? Порядок должен быть полным орднунгом, такая процедура, и очень правильная. Простой перезапуск текущего Утилизатора не требует санкции. Я его даже с мобилки могу сейчас перезапустить, юзера даже коннект не потеряют. Плановый перезапуск раз в месяц, если требуется. Я как правило им пользуюсь, где-то лики памяти всё-таки есть... |
| Автор: mindflyer 5.2.2008, 10:45 |
| Сегодня знакомый упомянул про некую http://www.terracotta.org/ - типа возможность в одной java-машине напрямую использовать объекты, которые реально хранятся в другой JVM. Ничего об этом не знаю, но по форме звучит похоже на название темы Кто-нить реально использовал эту штуку? Какие впечатления? |
| Автор: COVD 6.2.2008, 23:14 | ||
"напрямую" - это, очевидно, все равно обмен через сокетные соединения, но реализация скрыта. Так же "напрямую" работает и RMI. |