Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совместное использование памяти двумя приложениями, Как это сделать? 
V
    Опции темы
Prol
Дата 15.1.2008, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(serger @ 15.1.2008,  07:14)
это не так
Это лишь уведомление о необходимости - jvm САМА решает когда запускать.

gc() - принудительный вызов сборщика мусора.
Когда управление выходит из вызванного gc(), мусор уже убран.

Код

     /** java.lang.Runtime
     * Runs the garbage collector.
     * Calling this method suggests that the Java virtual machine expend 
     * effort toward recycling unused objects in order to make the memory 
     * they currently occupy available for quick reuse. When control 
     * returns from the method call, the virtual machine has made 
     * its best effort to recycle all discarded objects. 
     * <p>
     * The name <code>gc</code> stands for "garbage 
     * collector". The virtual machine performs this recycling 
     * process automatically as needed, in a separate thread, even if the 
     * <code>gc</code> method is not invoked explicitly.
     * <p>
     * The method {@link System#gc()} is the conventional and convenient 
     * means of invoking this method. 
     */
     public native void gc();


PM MAIL WWW ICQ   Вверх
batigoal
Дата 15.1.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Prol, это ошибка. Вызов сборщика мусора не гарантирован ВАЩЕ. Кое-как им можно управлять с помощью ключей запуска JVM, но это весьма ограниченное управление.

Раньше еще использовался такой прием - вызов gc() несколько раз подряд. Сейчас даже он уже не прокатывает.

Это сообщение отредактировал(а) batigoal - 15.1.2008, 09:40


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
serger
Дата 15.1.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 1
Всего: 5



да даже если бы и срабатывал сразу, к чему это приводило бы?

Вот тут сайт про JVM.
http://blogs.sun.com/vmrobot/category/GC

или вот есть такие шаманства (отсюда):
Следующий метод освобождает всю возможную память:
Код

public static void fullGC() {
     Runtime rt = Runtime.getRuntime();
     long isFree = rt.freeMemory();
     long wasFree;
     do {
          wasFree = isFree;
          rt.gc();
          isFree = rt.freeMemory();
     } while (isFree >> wasFree);
     rt.runFinalization();
}



Это сообщение отредактировал(а) serger - 15.1.2008, 09:57


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Prol
Дата 15.1.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(batigoal @ 15.1.2008,  09:38)
Prol, это ошибка. Вызов сборщика мусора не гарантирован ВАЩЕ. Кое-как им можно управлять с помощью ключей запуска JVM, но это весьма ограниченное управление.

Раньше еще использовался такой прием - вызов gc() несколько раз подряд. Сейчас даже он уже не прокатывает.

Что значит "ошибка"? В одном из базовых классов Java ошибка?

Его нельзя вызывать несколько раз подряд, это асинхронное событие имеющее длительно время исполнения. Сборщик мусора нужно вызывать не в основном потоке приложения, а делать для него отдельный поток и пользоваться как при асинхронном вводе-выводе, наверна, да? :о)
PM MAIL WWW ICQ   Вверх
intr
Дата 15.1.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.12.2005

Репутация: 1
Всего: 2



Вообщем пообщался с одним умным человекомsmile

gc() не просто удалят все неиспользуемые объекты из памяти он при вызове решает стоит удалять объекты из пямяти или нет на основе времени жизни объекта, количества свободной (занятой) ОЗУ и т.д.

то есть он попробует почистить памятьsmile но то что он удалит все неиспользуемые объекты он не обещает.

Так по крайней мере в стандартной Java машинеsmile

p/s
Кстати если нужен нормальный runtaime и адекватное время исполнение, то скорее всего надо использовать специальное железо от SUN и специальную сборку Java машины. Но стандартная сборка Java машины для этого точно не подходит! Но это ИМХО.
--------------------
Исследователь бытия и по совместительству Java-developer
PM MAIL WWW Skype GTalk   Вверх
batigoal
Дата 15.1.2008, 14:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Prol @  15.1.2008,  15:03 Найти цитируемый пост)
Его нельзя вызывать несколько раз подряд,

Что значит "нельзя"? Можно. Но исполняться оно будет долго.

Цитата(Prol @  15.1.2008,  15:03 Найти цитируемый пост)
Что значит "ошибка"? В одном из базовых классов Java ошибка?

Ошибка заложена уже в самой идее - управлять памятью в managed-языке. Приложение не может управлять своей выполняющей средой, оно может лишь рекомендовать ей что-то сделать, что и подтвержадется приведенным куском доки:
Цитата(Prol @  15.1.2008,  08:29 Найти цитируемый пост)
Calling this method suggests that the Java virtual machine ...


Цитата(Prol @  15.1.2008,  15:03 Найти цитируемый пост)
Сборщик мусора нужно вызывать не в основном потоке приложения, а делать для него отдельный поток 

Зачем? В том же фрагменте написано:
Цитата(Prol @  15.1.2008,  08:29 Найти цитируемый пост)
 The virtual machine performs this recycling ... in a separate thread


Рекомендую почитать статьи по тюнингу сборщика мусора, в Интернете их немало.

Добавлено через 1 минуту и 21 секунду
Цитата(intr @  15.1.2008,  15:24 Найти цитируемый пост)
Кстати если нужен нормальный runtaime и адекватное время исполнение, то скорее всего надо использовать специальное железо от SUN и специальную сборку Java машины. Но стандартная сборка Java машины для этого точно не подходит! Но это ИМХО. 

Для этого и создана Real-Time Java.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
intr
Дата 15.1.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.12.2005

Репутация: 1
Всего: 2



Вообщем пообщался с одним умным человекомsmile

gc() не просто удалят все неиспользуемые объекты из памяти он при вызове решает стоит удалять объекты из пямяти или нет на основе времени жизни объекта, количества свободной (занятой) ОЗУ и т.д.

то есть он попробует почистить памятьsmile но то что он удалит все неиспользуемые объекты он не обещает.

Так по крайней мере в стандартной Java машинеsmile

p/s
Кстати если нужен нормальный runtaime и адекватное время исполнение, то скорее всего надо использовать специальное железо от SUN и специальную сборку Java машины. Но стандартная сборка Java машины для этого точно не подходит! Но это ИМХО.


--------------------
Исследователь бытия и по совместительству Java-developer
PM MAIL WWW Skype GTalk   Вверх
Prol
Дата 15.1.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Мы отвлеклись от темы. :о)

Как обратиться к объекту (экземпляру класса), находящемуся в другом приложении?
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 15.1.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(Prol @  15.1.2008,  02:10 Найти цитируемый пост)
Фаза инициализации более трёх миллионов объектов в памяти занимает более 15 минут. Они читаются из БД и размещаются в памяти одним приложением. В случае, если ОС снимет это приложение, то время повторного перезапуска займёт те же более 15 минут, каковое время недопустимо по требованию заказчика.

Поэтому я запускаю две копии одного приложения. Первая копия при первом старте тратит 15 минут на чтение и размещение объектов в shared memory памяти и падает в sleep.
После того, как я вижу, что первое приложение отинитилось, то запускаю вторую копию этого же приложения. 
Поскольку оба приложения используют shared memory, то второе приложение (оно точно такое же по коду как и первое) получает уже отиниченную память со всеми тремя миллионами объектами и приступает к отработке очереди сообщений всего за одну секунду.



Я бы тогда пошел по другому пути - повышение надежности и отказоустойчивости.

Например запускаем Application Server у которого работает два приложения - одно хранит данные в некотором кэше (хранилище), другое (логика) - выполняет какие-либо действия с этими данными.

Падение Application Server - ну надо очень постараться. Даже если при выполнении логики что-то отвалится, то хранилище должно (и будет) нормально работать. Сервер просто подымет еще одну копию логики. И все.

Хотя инициализация трех миллионов объектов - это как-то странно.
PM MAIL WWW ICQ   Вверх
w1nd
Дата 15.1.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Prol @  15.1.2008,  15:32 Найти цитируемый пост)
Как обратиться к объекту (экземпляру класса), находящемуся в другом приложении?

Вам уже ответили - никак. Связь только через файл, отображаемый на память или сокеты (или любой другой более высокоуровневый механизм).


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
ecologist
Дата 16.1.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



Ну вообщем-то никто не мешает исполmзовать RMI или просто сокеты для общения приложений. Но правда в таком случае эффективность работы наверняка снизится.
Если же иметь в виду общую память, которую можно разделять между процессами, то это особенности ОС и кроссплатформенность JAVA на такие вещи не рассчитана.

Я бы тоже задумался (как и AntonSaburov) над проектированием системы.
PM MAIL   Вверх
Prol
Дата 16.1.2008, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(AntonSaburov @ 15.1.2008,  16:00)
Я бы тогда пошел по другому пути - повышение надежности и отказоустойчивости.

Например запускаем Application Server у которого работает два приложения - одно хранит данные в некотором кэше (хранилище), другое (логика) - выполняет какие-либо действия с этими данными.

Падение Application Server - ну надо очень постараться. Даже если при выполнении логики что-то отвалится, то хранилище должно (и будет) нормально работать. Сервер просто подымет еще одну копию логики. И все.

Хотя инициализация трех миллионов объектов - это как-то странно.

Что подразумевается под "Хранилищем"? Образ памяти или БД?
Application Server предоставляет доступ двум приложениям к одной памяти?

Добавлено через 2 минуты и 17 секунд
Цитата(w1nd @ 15.1.2008,  21:08)
Связь только через файл, отображаемый на память 

Как сделать в Java связь через файл, отображаемый на память?
PM MAIL WWW ICQ   Вверх
batigoal
Дата 16.1.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Prol @  16.1.2008,  10:09 Найти цитируемый пост)
Application Server предоставляет доступ двум приложениям к одной памяти?

Нет, но он может объединять несколько серверов в кластер, обеспечивая тем самым отказоустойчивость.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
w1nd
Дата 16.1.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата([B)
Prol[/B]]Как сделать в Java связь через файл, отображаемый на память?

В этой теме об этом уже говорили - http://forum.vingrad.ru/index.php?showtopi...t&p=1376155.



--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Prol
Дата 16.1.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(w1nd @ 16.1.2008,  11:26)
В этой теме об этом уже говорили - http://forum.vingrad.ru/index.php?showtopi...t&p=1376155.

Спасибо, но в этот файл невозможно загрузить методы и передать им управление :о(
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.