К сожалению, действительно потрясающий alloca()
отсутствует в почти удивительном TCC. Gcc имеет alloca()
.
Он сеет семя собственного уничтожения. С возвращением в качестве деструктора.
Как и malloc()
, он возвращает недопустимый указатель при сбое, который вызовет сбой в современных системах с MMU (и, надеюсь, перезапустит те, у которых нет).
В отличие от автоматических переменных, вы можете указать размер во время выполнения.
Хорошо работает с рекурсией. Вы можете использовать статические переменные для достижения чего-то похожего на хвостовую рекурсию и использовать несколько других, передавая информацию на каждую итерацию.
Если вы нажмете слишком глубоко, вы уверены в сегментации (если у вас MMU).
Обратите внимание, что malloc()
не предлагает больше, так как возвращает NULL (что также приведет к segfault, если назначено), когда системе не хватает памяти. То есть все, что вы можете сделать, это внести залог или просто попытаться назначить его любым способом.
Для использования malloc()
я использую глобалы и присваиваю им NULL. Если указатель не равен NULL, я освобождаю его перед использованием malloc()
.
Вы также можете использовать realloc()
в качестве общего случая, если хотите скопировать любые существующие данные. Вам нужно проверить указатель, прежде чем выяснить, собираетесь ли вы копировать или объединять после realloc()
.
Я думаю, что ответ Янниса здесь немного вводит в заблуждение. Просто сказать «нет, ты не можешь» - это еще не все. Вопрос сосредоточен на выгрузке классов Java в серверный процесс для удаления утечки кода из процесса JVM без перезапуска процесса. OP не запрашивает функцию изоляции памяти, подобную процессу, которую дает AppDomain, а возможность выгружать классы в работающей JVM. Я говорю как процесс, поскольку внутри AppDomain не является процессом, но он обладает некоторыми аспектами изоляции, которые предоставляет операционная система первоклассному процессу. Упомянутый изоляционный JSR относится к этой «процессной» изоляции. Возможна выгрузка загрузчиков java ClassLoaders и, следовательно, классов без зацикливания процесса ОС, на котором размещена JVM. Здесь упоминается пара методов: SO 148681 . Сделать это на Java нетривиально и элегантно, но возможно.
Переработка отдельных JVM на основе времени или конкретных критериев, таких как растущее потребление памяти и ограничения использования памяти, - это возможность расширенных версий сервера приложений, с которым я работаю, WebSphere. Если ваш сервер приложений не имеет такой возможности, то создание некоторых сценариев оболочки для предоставления чего-то вроде этой функции должно быть выполнимым.
Это работает довольно хорошо, если:
a). Запросы от пользователей распределяются по большему набору JVM. б). Все запросы не имеют состояния или имеется возможность репликации состояния. Репликация - это возможность WebSphere и WebLogic, я предполагаю, что другие серверы приложений тоже имеют такую возможность.
В таких средах нет необходимости «медленно» перемещать людей на другие серверы. Нам просто нужно знать, что мы можем безопасно остановить любую службу / JVM и что эти сеансы будут выполняться на другом экземпляре.
К сожалению, нет.
Аналогичная концепция в мире Java - Isolate, которая впервые появилась в JSR 121. Это был API для будущая функция JVM, которая обеспечит безопасное разделение и обмен данными между различными приложениями, работающими в одной JVM. После публикации JSR (около 2004 г.) одна исследовательская группа в Sun работала над проектом «Барселона». Этот проект попытался реализовать API изоляции в виртуальной машине Sun HotSpot 1.5. Через два года они выпустили прототип для SPARC / Solaris. Версии для Windows / Linux так и не были выпущены из-за проблем со стабильностью.
Недавно SUN представила ограниченную версию Isolation API для J2ME, сосредоточившись на предложении «нескольких процессов» в средах, которые активно их не предлагали. Относительно недавно, мы также спросили Sun об их статусе реализации Isolate API для стандартных JVM, и они ответили, что они планируют выпустить JVM с ограниченной поддержкой. Они планируют предложить возможность загрузки / выгрузки изолятов, но без возможности связи между ними.
Кроме того, было проведено старое исследование по созданию совместимой с изоляторами версии JVM, называемой JanosVM (java 1.1), но я сомневаюсь что сегодня он может быть любым.
Надеюсь, это поможет ...