Основное различие - то, что при использовании синхронизируемого блока, можно соединить объект кроме это , который позволяет быть намного более гибким.
Предполагают, что у Вас есть очередь сообщений и несколько производителей сообщения и потребителей. Мы не хотим, чтобы производители вмешались друг в друга, но потребители должны смочь получить сообщения, не имея необходимость ожидать производителей. Таким образом, мы просто создаем объект
Object writeLock = new Object();
И с этого времени каждый раз, производители хотят добавить новое сообщение, мы просто соединяем это:
synchronized(writeLock){
// do something
}
, Таким образом, потребители могут все еще читать, и производители будут заблокированы.
Я вижу два варианта, если вы хотите автоматизировать дамп кучи, но решение @ Mark с дампом кучи в OOM неудовлетворительно.
MemoryMXBean
для обнаружения высокого давления памяти, а затем программно создает дамп кучи , если использование (или дельта использования) кажется высоким.
jmap
(работает как локально, так и удаленно). Было бы неплохо, если бы у вас был обратный вызов на OOM, но, ммм, этот обратный вызов, вероятно, просто вылетит из-за ошибки OOM. :)
Вы можете передать следующие аргументы JVM при запуске, и дамп кучи будет автоматически создан при ошибке OutOfMemoryError. Второй аргумент позволяет указать путь к файлу дампа кучи. По крайней мере, используя это, вы могли бы проверить наличие определенного файла, чтобы увидеть, произошел ли дамп кучи.
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<value>
Вы смотрели JConsole ? Он использует JMX, чтобы предоставить вам видимость различных показателей JVM, включая информацию о памяти. Вероятно, стоило бы отслеживать ваше приложение, используя это для начала, чтобы понять, как и когда потребляется память. Вы можете обнаружить, что память расходуется равномерно в течение дня или при использовании определенных функций.
Взгляните на раздел обнаружение нехватки памяти по приведенной выше ссылке.
Если вам нужно, вы можете тогда напишите JMX-клиент для автоматического наблюдения за приложением и запуска любых необходимых действий. JConsole укажет, какие методы JMX необходимо опросить.
И альтернативой ожиданию, пока приложение не выйдет из строя, может быть сценарий контролируемого перезапуска, как каждую ночь, если вы оптимистично настроены, что он может прожить двенадцать часов ..
Может, даже веб-сфера сможет сделать это за вас!?
Вы можете добавить класс слушателя (прослушиватель атрибута области действия или области действия приложения), который будет вызываться каждый при добавлении нового объекта в область сеанса / приложения.
В этом случае вы можете попытаться проверить общую память, используемую приложением (зарегистрировать его), как вызов run gc (обратите внимание, что его вызов не означает, что gc всегда будет запускаться )
(Вышеуказанное относится к части ведения журнала и gc в зависимости от роста использования)
Для запланированного gc: Кроме того, вы можете сохранить класс задачи таймера, который запускается каждые несколько часов и выполняет запрос gc.
Наш опыт работы с ITCAM был далеко не лучшим с точки зрения мониторинга. Мы отказались от него в пользу CA Wily Introscope.
Приходилось ли вам знакомиться с инструментом jvisualvm в последней версии Java 6 JDK?
Он отлично подходит для проверки работающего кода.
Я бы поспорил, что вам нужны дампы кучи, когда происходит OOM. Периодический сбор информации с течением времени должен дать представление о том, что происходит.
Как уже отмечалось, существуют различные инструменты для анализа этих проблем. Я добился успеха с ITCAM для WebSphere, и, как специалист IBM, я имею к нему доступ. Мы очень быстро смогли определить точные строки кода в проблемной ситуации.
Если есть какой-то способ получить инструмент такого рода, то это '