java - 减少 Java 堆大小

标签 java memory profiling heap-memory

我有一个应用程序,它使用大量内存来区分两个可能巨大的 (100k+) 目录的内容。对我来说,这样的操作会使用大量内存是有道理的,但是一旦我的差异操作完成,堆就会保持相同的大小。

我基本上有代码实例化一个类来存储源和目标上每个文件的文件名、文件大小、路径和修改日期。我把增删改查保存在其他数组中。然后我 clear() 我的源数组和目标数组(现在可能每个都超过 100k),留下相对较小的添加、删除和更新数组。

不过,在我clear() 我的目标和源数组之后,内存使用率(通过 VirtualVM 和 Windows 任务管理器可见)并没有下降。我对 VirtualVM(或与此相关的任何分析器)没有足够的经验来弄清楚是什么占用了所有这些内存。 VirtualVM 的堆转储列出了保留大小为几兆字节的前几个对象。

有什么可以帮助我指明正确方向的吗?

最佳答案

如果使用过的堆在垃圾回收后下降,那么它可能会按预期工作。 Java 在需要更多内存时增加其堆,但不释放它——它更愿意保留它以防应用程序再次使用更多内存。参见 Is there a way to lower Java heap when not in use?对于这个主题,为什么heap使用量减少后heap没有减少。

关于java - 减少 Java 堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582859/

相关文章:

java - 如何在Java Spring Boot中读取Resources中保存的文件

c - Heapcrash - 通过增加指向堆的指针来段错误

c - 一个字符是否作为带有填充的整个单词保存在内存中?

java - 如何分析 NetBeans Maven 项目中的 JUnit 测试?

java - 使用 ffmpeg 降低比特率

java - 如何通过查询方法(SQLiteDatabase.query)使用此查询?

android - 根据可用内存加载 GridLayout 图片

python - 如何分析 Python 脚本的 CPU 使用率?

.net - 追查 .NET 4.0 Induced GC 的来源

java - 将 LazySeq 从 Clojure 返回到 Java 时出现 ClassCastException