0

我正在使用 java 来构建一个套接字服务器。

我正在记录服务器运行期间发生的许多操作,并且在每个日志行旁边,我正在使用以下命令在 JVM 中写入当前可用内存:

Runtime.getRuntime().freeMemory()

正如我在日志中看到的,我没有很多可用内存(大约 14-15 MB)。

我在具有 root 访问权限的 freeBSD 服务器上运行此套接字服务器。

我真的很想调整分配给我的 JVM 的内存,但我真的不知道怎么做,而且我对 freeBSD 和 linux 很陌生。

4

1 回答 1

4

您对 Java 中内存如何工作(尤其是垃圾收集)的假设是有缺陷的。

Runtime.getRuntime().freeMemory().

该调用仅显示JVM 堆上的“空闲”内存,该内存使用和命令行参数分配给. 或者,如果您使用的是应用服务器,则在某些启动脚本中。-Xms-Xmxjava

为什么你试图做的是浪费时间

看到这个问题的答案为什么

Java 中的垃圾收集器(控制空闲内存)并未针对保持尽可能多的可用内存进行调整,而是针对性能和响应能力的平衡进行了调整。它只按需释放内存,拥有最大可用内存没有任何好处,而且尝试这样做有很多缺点。

这会导致不再引用的对象在“使用内存”周围徘徊,直到实际需要它们占用的内存。这实际上是最佳的,因为过早地删除它们会导致运行代码的性能下降。

仅当需要释放内存时才快速删除它们是垃圾收集器的目标,而不是试图保持尽可能多的可用内存。

永远不必调用System.gc()正确实现的 Java 程序。

Java HotSpot 包括三个不同的收集器。串行集合使用单线程进行 GC,最适合数据集小于 100 MB 的单处理器机器。并行并行执行次要收集。它非常适合在多线程或多处理器硬件上运行的中型到大型数据集。当响应时间比吞吐量更重要时,并发收集器已针对垃圾收集暂停时间进行了优化。这种模式通常不会在单核机器上提供任何好处。

避免 OutOfMemoryExceptions

  1. 在您的服务器上设置-Xmx尽可能大的设置。设置-Xms为您认为名义上的最小内存块大小。太小比太大更糟糕。

  2. 不要泄露参考。

于 2012-05-17T15:56:38.453 回答