我正在开发一个应用程序,它获取一个视频文件,在一个单独的线程上以 30FPS 的速度在 jframe 上播放视频文件,然后以固定的时间间隔在另一个线程上将图像拆分几次,以处理来自大文件的一些信息框架。播放视频效果很好。当我开始尝试拆分帧时,我开始出现内存泄漏并导致崩溃。帧大小为 1440x896。现在我正在使用计时器来处理分割视频:
new Thread()
{
public void run()
{
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try
{
System.out.println("Calling Update Logic");
if (frame == null)
return;
Mat tables = frame;
Runnable splitter = new Splitter(tables);
Thread splitterThread = new Thread(splitter);
splitterThread.start();
tables = null;
}
catch(Exception gf){gf.printStackTrace();}
}
}, 100, 100);
}
}.start();
Splitter 然后抓取屏幕的 4 个区域,每个区域的大小为 575 x 426。然后通过从不同位置拉出大约 10-15 个东西来使用这 4 个区域进一步处理特定区域。这些范围从 10x50 到 35-60。这些拆分中的每一个都在单独的线程上处理。在这个单独的线程上,它获取感兴趣区域并创建一个新的
BufferedImage
并将随机背景与感兴趣区域相结合,以便可以将其提交给网络进行检测。网络尺寸为 96x96。所以它是一个相当小的图像。.release()
并将它们设置为 null
但它仍然有同样的问题,它会消耗内存直到达到其限制并且应用程序停止。
当我尝试分析时,堆转储显示很多
byte[]
。我之前没有做过太多分析,这是我第一次在 Java 中看到这种内存泄漏,所以我有点难过。
这里是转储:
Current thread (0x00007fec980032a0): JavaThread "pool-349-thread-2" [_thread_in_native, id=242197, stack(0x00007fe8a5f00000,0x00007fe8a6000000)]
Stack: [0x00007fe8a5f00000,0x00007fe8a6000000], sp=0x00007fe8a5ffe130, free space=1016k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libopencv_dnn.so.3.4+0x162171] cv::dnn::experimental_dnn_34_v21::Net::Impl::forwardLayer(cv::dnn::experimental_dnn_34_v21::LayerData&)+0xc61
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 2836 org.opencv.dnn.Net.forward_4(JJLjava/util/List;)V (0 bytes) @ 0x00007ffa50ef1700 [0x00007ffa50ef16a0+0x0000000000000060]
J 2937 c1 org.opencv.dnn.Net.forward(Ljava/util/List;Ljava/util/List;)V (30 bytes) @ 0x00007ffa49f5450c [0x00007ffa49f54380+0x000000000000018c]
J 2655 c2 watcher.ai.Detect.call()Lwatcher/data/Card; (597 bytes) @ 0x00007ffa50eda1f0 [0x00007ffa50ed9fa0+0x0000000000000250]
J 2801 c1 watcher.ai.Detect.call()Ljava/lang/Object; (5 bytes) @ 0x00007ffa49f01a44 [0x00007ffa49f019c0+0x0000000000000084]
J 2005 c1 java.util.concurrent.FutureTask.run()V [email protected] (123 bytes) @ 0x00007ffa49d5b69c [0x00007ffa49d5aec0+0x00000000000007dc]
J 2431 c1 java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V [email protected] (187 bytes) @ 0x00007ffa49e204ac [0x00007ffa49e1fba0+0x000000000000090c]
J 2430 c1 java.util.concurrent.ThreadPoolExecutor$Worker.run()V [email protected] (9 bytes) @ 0x00007ffa49e1e4bc [0x00007ffa49e1e440+0x000000000000007c]
J 1938 c1 java.lang.Thread.run()V [email protected] (17 bytes) @ 0x00007ffa49d2a204 [0x00007ffa49d2a0c0+0x0000000000000144]
v ~StubRoutines::call_stub
siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000019
有什么建议吗?