了解 java 中的垃圾回收

Understanding garbage collection in java

我正在努力解决 Java 中的一些垃圾收集/分配概念。我会用下面的例子来说明我的误解。

我有一个 Android 应用程序,我从传感器收集数据并将值存储在一个数组中,该数组永远不会超过 N 个样本。使用 Android Studio,我可以实时观看空闲内存与分配内存的对比。当我的应用程序运行时,我可以看到分配的内存缓慢增加(而可用内存减少)。当可用内存接近 0 时,系统运行垃圾收集,我看到分配的内存显着下降。有时,当可用内存接近 0 时,系统会进行垃圾回收,这会增加我分配的内存,但也会增加内存开销。

1) 如果执行垃圾回收时分配的内存下降到 'original levels' 是否意味着我没有内存泄漏?据我了解,内存泄漏意味着垃圾回收无法释放分配的内存。

2) 即使数组大小限制为 N 个样本,分配的内存继续增加这一事实是否表明我在我的应用程序中进行了不必要的分配?一旦阵列命中 N 个样本,我会在执行 array.add() 之前执行 array.remove(0)。我认为一旦数组中有 N 个样本,分配的内存就不会继续增加。

  1. 你是对的。
  2. 没有。每次创建新样本时,都需要内存,内存就是这样分配的。然后你删除了一个使用内存的旧样本。此内存不会立即回收。只有当垃圾收集决定 运行 时,它才会被回收。那是你看到分配的内存减少的时候。