我正在使用 java 构建套接字服务器。
我正在记录服务器运行期间发生的大量操作, 在每个日志行旁边,我使用以下命令写入 JVM 中的当前可用内存:
Runtime.getRuntime().freeMemory()
正如我在日志中看到的,我没有大量可用内存(大约 14-15 MB)。
我在具有 root 访问权限的 freeBSD 服务器上运行此套接字服务器。
我真的很想调整分配给我的 JVM 的内存,但我真的不知道如何做,而且我对 freeBSD 和 Linux 总体来说还很陌生。
最佳答案
您对 Java 中内存如何工作(尤其是 Garbage Collection )的假设是有缺陷的。
Runtime.getRuntime().freeMemory()
。
That call only shows "free" memory on the JVM heap ,使用 -Xms
和 -Xmx
命令行参数分配给 java
。或者在某些启动脚本中(如果您使用的是应用程序服务器)。
为什么你想做的事情是浪费时间
Java 中的垃圾收集器(控制可用内存)并不是为了尽可能多地保留可用内存而进行调整的,而是为了性能和响应能力的平衡而进行调整的。它仅按需释放内存,拥有最大可用内存没有任何好处,并且尝试这样做有很多缺点。
这会导致不再引用的对象“使用内存”徘徊,直到实际需要它们占用的内存为止。这实际上是最佳的,因为过早删除它们会导致运行代码的性能下降。
仅当需要释放内存时才快速删除它们是垃圾收集器的目标,而不是尝试保持尽可能多的可用内存。
您应该永远必须在正确实现的 Java 程序中调用 System.gc()
。
Java HotSpot includes three different collectors. The serial collection uses a single thread for GC and is best suited for single processor machines with data sets smaller than 100 Mbytes. The parallel performs minor collections in parallel. It is ideally suited for medium to large datasets running on multi-threaded or multi-processor hardware. The concurrent collector has been optimized to garbage collection pauses short when response time is more important than throughput. This mode does not normally provide any benefit on a single-core machine.
避免 OutOfMemoryExceptions
将
-Xmx
设置为服务器上可以承受的尽可能大的设置。将-Xms
设置为您认为名义上的最小内存块大小。太小比太大更糟糕。不要泄露引用资料。
关于java 空闲内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10639114/