КонфигурацияПочему Direct ByteBuffer постоянно растет на сервере HornetQ, ведущем к OOM?
У меня есть установка автономной HornetQ (2.4.7-Final) кластера на Ubuntu 12.04.3 LTS (GNU/Linux 3.8.0-29-родовой x86_64). Экземпляр имеет 16 ГБ оперативной памяти с 2 ядрами, и я назначил -Xms5G -Xmx10G для JVM.
Ниже приводится установка адреса в конфигурации HornetQ:
<address-settings>
<address-setting match="jms.queue.pollingQueue">
<dead-letter-address>jms.queue.DLQ</dead-letter-address>
<expiry-address>jms.queue.ExpiryQueue</expiry-address>
<redelivery-delay>86400000</redelivery-delay>
<max-delivery-attempts>10</max-delivery-attempts>
<max-size-bytes>1048576000</max-size-bytes>
<page-size-bytes>10485760</page-size-bytes>
<address-full-policy>PAGE</address-full-policy>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
</address-setting>
<address-setting match="jms.queue.offerQueue">
<dead-letter-address>jms.queue.DLQ</dead-letter-address>
<expiry-address>jms.queue.ExpiryQueue</expiry-address>
<redelivery-delay>3600000</redelivery-delay>
<max-delivery-attempts>25</max-delivery-attempts>
<max-size-bytes>1048576000</max-size-bytes>
<page-size-bytes>10485760</page-size-bytes>
<address-full-policy>PAGE</address-full-policy>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
</address-setting>
<address-setting match="jms.queue.smsQueue">
<dead-letter-address>jms.queue.DLQ</dead-letter-address>
<expiry-address>jms.queue.ExpiryQueue</expiry-address>
<redelivery-delay>3600000</redelivery-delay>
<max-delivery-attempts>25</max-delivery-attempts>
<max-size-bytes>1048576000</max-size-bytes>
<page-size-bytes>10485760</page-size-bytes>
<address-full-policy>PAGE</address-full-policy>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
</address-setting>
<!--default for catch all-->
<!-- delay redelivery of messages for 1hr -->
<address-setting match="#">
<dead-letter-address>jms.queue.DLQ</dead-letter-address>
<expiry-address>jms.queue.ExpiryQueue</expiry-address>
<redelivery-delay>3600000</redelivery-delay>
<max-delivery-attempts>25</max-delivery-attempts>
<max-size-bytes>1048576000</max-size-bytes>
<page-size-bytes>10485760</page-size-bytes>
<address-full-policy>PAGE</address-full-policy>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
</address-setting>
</address-settings>
Есть 10 других очередей, связанные с адресом по умолчанию, заданный групповой символ.
Проблема
В течение периода времени, память с прямым ByteBuffer постепенно увеличивается в размерах и даже занимает пространство подкачки в конечном итоге метание OutOfMemoryError («Прямой буфер памяти»).
Я пробовал много настроек JVM и JMS, но напрасно. Даже задание -XX: MaxDirectMemorySize = 4G для JVM привело к раннему OOME по той же причине. Кажется, что ByteBuffer не читается, или GC не требует памяти без ссылок.
Неужели кто-то сталкивался с тем же вопросом раньше?
Любые предложения приветствуются и благодарим заранее.
Вы можете запустить Java с '-Dio.netty.leakDetectionLevel = ПАРАНОИДНОЙ' – Ferrybig
Связанные с этим? http://www.evanjones.ca/java-bytebuffer-leak.html –