- Использование Apache Commons-math, которое реализует умножение матрицы чисто и Lineal Algebra
- . /> < /ol>
Преимущество выполнения этого с помощью OpenCV, конечно, Speeeeed, но недостаток в том, что Mat < /code> объекты находятся в нативной памяти, а не в памяти JVM. Апач-кишки, с другой стороны, реализует линейную алгебру исключительно на JVM, что является медленной, но, по крайней мере, память управляется должным образом.
Чтобы обойти проблему с памятью OpenCV, я обернул мат в класс wrapper. Этот класс обертки регистрирует более чистый , который, в свою очередь, вызывает mat.release () , таким образом, освобождая память:, протекает память. Я взял свалку кучи и изучил HeapDump в VisualVM и нашел следующее: < /p>Код: Выделить всё
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
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
я исследовал еще немного и обнаружил, что существует как минимум 1000 экземпляров коврика, на которые ссылаются только их чистый развод>
Подробнее здесь: https://stackoverflow.com/questions/797 ... collection