您对 Java 中内存如何工作(尤其是垃圾收集)的假设是有缺陷的。
Runtime.getRuntime().freeMemory()
.
该调用仅显示JVM 堆上的“空闲”内存,该内存使用和命令行参数分配给. 或者,如果您使用的是应用服务器,则在某些启动脚本中。-Xms
-Xmx
java
为什么你试图做的是浪费时间
看到这个问题的答案为什么!
Java 中的垃圾收集器(控制空闲内存)并未针对保持尽可能多的可用内存进行调整,而是针对性能和响应能力的平衡进行了调整。它只按需释放内存,拥有最大可用内存没有任何好处,而且尝试这样做有很多缺点。
这会导致不再引用的对象在“使用内存”周围徘徊,直到实际需要它们占用的内存。这实际上是最佳的,因为过早地删除它们会导致运行代码的性能下降。
仅当需要释放内存时才快速删除它们是垃圾收集器的目标,而不是试图保持尽可能多的可用内存。
您永远不必调用System.gc()
正确实现的 Java 程序。
Java HotSpot 包括三个不同的收集器。串行集合使用单线程进行 GC,最适合数据集小于 100 MB 的单处理器机器。并行并行执行次要收集。它非常适合在多线程或多处理器硬件上运行的中型到大型数据集。当响应时间比吞吐量更重要时,并发收集器已针对垃圾收集暂停时间进行了优化。这种模式通常不会在单核机器上提供任何好处。
避免 OutOfMemoryExceptions
在您的服务器上设置-Xmx
尽可能大的设置。设置-Xms
为您认为名义上的最小内存块大小。太小比太大更糟糕。
不要泄露参考。