我正在使用java构建套接字服务器。
我正在记录服务器运行期间发生的许多操作, 在每个日志行旁边,我使用:
在JVM中编写当前可用内存Runtime.getRuntime().freeMemory()
正如我在日志中看到的那样,我没有大量的可用内存(大约14-15 MB)。
我在具有root访问权限的freeBSD服务器上运行此套接字服务器。
我真的想调整分配给我的JVM的内存,但我真的不知道怎么做,而且我对freeBSD和linux一般都是新手。
答案 0 :(得分:4)
你假设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包含三个不同的收集器。连载 集合使用单个线程进行GC,最适合单个 数据集小于100 MB的处理器计算机。该 parallel并行执行次要集合。它非常适合 适用于在多线程或多线程上运行的中型到大型数据集 多处理器硬件。并发收集器已经过优化 当响应时间更长时,垃圾收集暂停 比吞吐量重要。此模式通常不提供任何 在单核机器上受益。
避免OutOfMemoryExceptions
将-Xmx
设置为您在服务器上可以承受的设置。将-Xms
设置为您认为是名义上的最小内存块大小。太小太差了。
不要泄漏参考文献。