Нативные объекты не запускают сбор мусораJAVA

Программисты JAVA общаются здесь
Anonymous
Нативные объекты не запускают сбор мусора

Сообщение Anonymous »

Я пытаюсь сделать немного линейной алгебры в Kotlin/JVM, и у меня есть два способа сделать это:
  • Использование Apache Commons-math, которое реализует умножение матрицы чисто и Lineal Algebra
  • . /> < /ol>
    Преимущество выполнения этого с помощью OpenCV, конечно, Speeeeed, но недостаток в том, что Mat < /code> объекты находятся в нативной памяти, а не в памяти JVM. Апач-кишки, с другой стороны, реализует линейную алгебру исключительно на JVM, что является медленной, но, по крайней мере, память управляется должным образом.
    Чтобы обойти проблему с памятью OpenCV, я обернул мат в класс wrapper. Этот класс обертки регистрирует более чистый , который, в свою очередь, вызывает mat.release () , таким образом, освобождая память:

    Код: Выделить всё

    import org.opencv.core.Mat
    import java.lang.AutoCloseable
    import java.lang.ref.Cleaner
    
    val cleaner: Cleaner by lazy {
    Cleaner.create()
    }
    
    class OpenCVMatrixDataContainer(private val mat: Mat) : AutoCloseable {
    private val cleanable: Cleaner.Cleanable = cleaner.register(this, CleanRunnable(mat))
    
    // This class has more members to perform linear algebra operations which I left out here for brevity
    
    override fun close() {
    cleanable.clean()
    }
    
    private class CleanRunnable(val mat: Mat) : Runnable {
    override fun run() {
    mat.release()
    }
    }
    }
    < /code>
    При запуске моего приложения я понял, что использование оперативной памяти прошло через крышу при выполнении линейной алгебры с OpenCV. Поэтому я перешел на Apache Commons-Math, что намного медленнее, но использование RAM было разумным. Поэтому я начал исследовать, является ли мой класс OpenCVmatrixDataContainer 
    , протекает память. Я взял свалку кучи и изучил HeapDump в VisualVM и нашел следующее: < /p>

    100.802.138 Объекты были рассмотрены для завершения < /li>
    При сортировке по размеру объекта в байтах, 58% от кучи были подняты на java.lang.LANG.Re.FANLAIR. org.opencv.core.mat .
  • При сортировке по количеству экземпляров, оба, финализатор и mat занимают 40% каждый. /> Кроме того, я нашел следующие вещи: < /p>

    При непосредственном соединении VisualVM к JVM нажимает кнопку «Выполнить GC» мгновенно очищает кучу (использование RAM мгновенно в моем коде. Вызов System.gc () , не нужно учитывать меня об этом в комментариях).
Поэтому мои выводы следующие:

Похоже, что объекты не вытекают на визуализацию. /> Поскольку Mat < /code> объекты хранят данные в собственной памяти, их память в памяти JVM крошечная (это в основном просто указатель). Я предполагаю, что GC видит только это крошечное использование памяти и не видит необходимости бежать. /> Есть ли какие-нибудь параметры JVM для запуска GC чаще?

Код: Выделить всё

root@dcdee140fe0e:/home# java -version
Picked up JAVA_TOOL_OPTIONS: -Xmx120G
openjdk version "21.0.8" 2025-07-15
OpenJDK Runtime Environment (build 21.0.8+9-Ubuntu-0ubuntu122.04.1)
OpenJDK 64-Bit Server VM (build 21.0.8+9-Ubuntu-0ubuntu122.04.1, mixed mode, sharing)
< /code>
Приложение запускается с помощью следующей командной строки: < /p>
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -classpath "server.jar:lib/*:libProject/*:." server.MainKt
edit:
я исследовал еще немного и обнаружил, что существует как минимум 1000 экземпляров коврика, на которые ссылаются только их чистый развод>

Подробнее здесь: https://stackoverflow.com/questions/797 ... collection

Вернуться в «JAVA»