У меня есть проект Java, который работает с одной библиотекой DLL через COM. У меня Windows 7, и я использую 32-разрядную Java 1.6. Я использую 2012/04/26 выпуск com4j в качестве моста. Оно работает.Утечки Com4j с помощью DirectByteBuffer, Cleaner, Finalizer, экземпляры вариантов
Проблема в том, что у меня серьезная утечка памяти, что делает работу моей программы практически невозможной.
Я подписался на некоторые события COM. Когда придет следующее событие, я наблюдаю увеличение памяти кучи, и GC никогда не помогает ее уменьшить. Если я использую COM4J.cleanUp() - использование памяти останавливает его рост, но события больше не поступают. Память кучи, используемая моей программой, очень быстро растет, в то время как на самом деле не выделяются мои собственные объекты.
разницаСнимки в VisualVM: http://postimg.org/image/cxg77ft8j/
Heap памяти поднять в VisualVM: http://postimg.org/image/m52g63b51/
Похоже, проблема с DirectByteBuffer, Чистильщик, Variant и экземпляры финализации. Я не создаю их самостоятельно. Это что-то внутри com4j.
Любые предложения?
Большое спасибо, mattes! Я рад, что этот проект все еще жив. – MiamiBeach
Я использую следующий Maven зависимость: org.jvnet.com4j com4j 20120426-2 Похоже, несвежий? Не могли бы вы рассказать мне, как вы получили свою стабильную версию com4j: какой из артефактов maven, из которого вы использовали репо, и что ELSE вы слились там? –
MiamiBeach
Теперь я решаю свою проблему очень странным образом: я просто деактивирую свой старый COM-объект Java и воссоздаю его каждые 15 минут :) После того, как слушатели отключены, GC успешно завершен. – MiamiBeach