java 空闲内存使用情况

标签 java memory jvm

我正在使用 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。或者在某些启动脚本中(如果您使用的是应用程序服务器)。

为什么你想做的事情是浪费时间

查看此answer对此question为什么!

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

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

  2. 不要泄露引用资料。

关于java 空闲内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10639114/

相关文章:

scala - 如何开始使用 scala

java - chalice : <g:layoutTitle> does not work

ios - CTFontRef 导致内存泄漏

unix - Java 程序无法在 Unix 机器上启动

Java堆分布概念查询

java - JPype/Java - 初始化或获取剩余堆空间

java - 如何向 JNI_CreateJavavm 调用创建的 JVM 发送信号?

javax.ejb.NoSuchEJBException : EJBCLIENT000079 Eclipse, JBOSS,EJB 3.1

java - 从 Eclipse 和 cmd 运行的结果不同? Java程序--魔方

Java Random.nextInt() 仅在循环中重复数字