Java是一种“托管语言”。这意味着,当您不再使用应用程序时,您在应用程序中使用的所有内容(例如类或数组的实例)都会自动被销毁。这是由“垃圾收集器”完成的。因此,当您创建例如阵列时(
float[] arr = new float[1000];
)然后分配内存,但您永远不需要自己释放内存,因为当您不再使用阵列时,垃圾收集器会为您这样做(
arr
).
然而,在某些情况下,垃圾收集器不知道如何自动为您释放某些内容。例如,当您在视频内存(VRAM)中分配一些空间时,您无法直接访问该内存,而是使用图形驱动程序来使用该内存。例如(伪代码):
byte[] image = loadImageFromDisk();
int vramId = graphicsDriver.allocateMemory(image.length);
graphicsDriver.copyToVRAM(vramId, image);
image = null;
...
// At this point the garbage collector will release the memory used by "image".
// However, the allocated VRAM still contains a copy of the image, so you can still use it.
...
graphicDriver.showImageOnScreen(vramId);
...
// The garbage collector can't free the VRAM though, you need to manually free that memory.
...
graphicsDriver.releaseMemory(vramId);
因此,实际上,在这种情况下有两种资源。
-
垃圾收集器将自动释放的资源。让我们称之为:
托管资源
.
-
本地资源
正如您可能想象的那样,libgdx在后台使用了相当多的本地资源。为了正确管理libgdx包含的资源
Disposable
接口使用(直接或间接)垃圾收集器无法自动释放的本机资源。因此,您需要手动调用
dispose
如果您不再需要它们,请在这些类上使用。
不呼叫
处置
方法可能会导致本机资源出现问题。E、 g.可能会耗尽可用的视频内存或类似内存,导致应用程序崩溃或类似情况。这通常被称为“内存泄漏”。