我正在使用java构建一个套接字服务器。
我记录了服务器运行期间发生的大量操作,在每个日志行旁边,我使用以下命令在JVM中写入当前可用内存:
Runtime.getRuntime().freeMemory()
正如我在日志中看到的,我没有太多可用内存(大约14-15MB)。
我在具有根访问权限的freeBSD服务器上运行此套接字服务器。
我真的很想调优分配给我的JVM的内存,但我真的不知道怎么调优,而且我对freeBSD和linux总体来说也是相当陌生的。
发布于 2012-05-17 23:56:38
在Java语言中,关于内存如何工作的假设(尤其是Garbage Collection )是有缺陷的。
Runtime.getRuntime().freeMemory()
。
That call only shows memory on the JVM heap,,分配了,并将-Xms
和-Xmx
命令行参数设置为java
。或者,如果您使用的是应用程序服务器,则在某些启动脚本中。
为什么你要做的事情是浪费时间
Java中的垃圾收集器(控制空闲内存)并不是为了尽可能多地保留空闲内存而调优的,它是针对性能和响应性之间的平衡进行调优的。它只按需释放内存,拥有最大可用内存没有任何好处,但尝试这样做有很多缺点。
这会导致不再被引用的对象挂起“使用内存”,直到实际需要它们占用的内存。这实际上是最佳的,因为过早地删除它们会导致正在运行的代码的性能下降。
垃圾收集器的目标是仅在需要释放内存时快速删除它们,而不是,它试图尽可能多地释放内存。
在正确实现的程序中,您永远不应该调用System.gc()
。
Java HotSpot包括三个不同的收集器。串行收集使用单个线程进行GC,最适合数据集小于100 is的单处理器机器。并行以并行方式执行次要集合。它非常适合在多线程或多处理器硬件上运行的中型到大型数据集。并发收集器已经过优化,当响应时间比吞吐量更重要时,垃圾收集暂停较短。此模式通常不会在单核计算机上提供任何好处。
避免OutOfMemoryExceptions的
-Xmx
设置为您在服务器上可以承受的最大设置。将-Xms
设置为您认为标称的内存块的最小大小。太小比太大更糟糕。https://stackoverflow.com/questions/10639114
复制相似问题