deepjavalibrary / djl

An Engine-Agnostic Deep Learning Framework in Java
https://djl.ai
Apache License 2.0
4.08k stars 650 forks source link

Memory Leak #3109

Open BOOMXIKA opened 5 months ago

BOOMXIKA commented 5 months ago

Description

In a SpringBoot Web application, the memory is not released after the method execution is completed.

Expected Behavior

The memory is not released after the method execution is completed.After stopping the application, the memory returns to normal.

Error Message

The JVM does not display any error messages, but the operating system issues memory warning messages

How to Reproduce?

code

Steps to reproduce

code1

Environment Info

dpen

frankfliu commented 5 months ago

This is expected behavior:

  1. When you use TensorFlow engine, TensorFlow create native memory. On Java side, we don't have control to make TensorFlow release memory back to system. In general, you won't see system memory usage reduce until you stop the application.
  2. But this doesn't mean there is memory leak, when close NDArray, TensorFlow will free up internal memory allocation, and reuse the memory to create another NDArray. Usually the total memory will stablize at peak, and won't always increase.
  3. You need to make sure to close NDArray (or Model, Predictor etc) to ensure no native memory leak.
BOOMXIKA commented 5 months ago

After I execute this method a few more times, the os will crash and jvm will throw an exception of "EXCEPTION_UNCAUGHT-CXX-EXCEPTION (0xe06d7363) at pc=0x00007ffd468c53ac, pid=25956, tid=27768",is this correct?

frankfliu commented 5 months ago

Looks like there is something wrong with your code.

Can you take a look our springboot example: https://github.com/deepjavalibrary/djl-spring-boot-starter-demo. That project doesn't have memory leak issue.

BOOMXIKA commented 5 months ago

I understand what you're saying "But this doesn't mean there is memory leak"! Now,My question is how to implement memory recycling?The meaning is that when I don't need to use these models, they won't take up native memory.