【问题标题】:Java Heap memory usage fluctuationJava Heap 内存使用波动
【发布时间】:2016-03-17 19:12:37
【问题描述】:

亲爱的开发者们,您好,

我在我的 java 应用程序中遇到堆内存使用问题。 应用程序本身只是接受 Socket 连接

主线程我只有以下脚本(静态 ExecutorService 实例除外):

ServerSocketFactory serverFactory = ServerSocketFactory.getDefault();
ServerSocket server = serverFactory.createServerSocket(Configuration.port);
for(;;)
{
  Socket client = server.accept();
  Configuration.getExecutor().submit(new Client(client));
}

当应用程序运行时,它应该阻塞循环,直到有人连接...... 这意味着我的主线程大部分时间都处于等待状态...

问题是:当没有人连接到我的服务器时,堆内存使用量波动(见下面的截图) 这意味着存在内存泄漏?不?或者这是 java 应用程序的自然行为方式?

提前谢谢...

【问题讨论】:

  • 如果发生内存泄漏,使用量会增加。
  • 对我来说就像正常的 GC 活动。您可以使用各种 JVM args 调整 GC 策略的积极性,但这看起来很正常。我会继续前进。
  • 感谢您澄清@Kayaman :)
  • 是的,有一个特别的设置会影响在 GC 中花费的 CPU 时间百分比。默认设置允许堆增长直到接近最大值,然后 GC 将运行(我认为)。更激进的选项将在 GC 上花费更多时间,从而在用户代码上花费更少的时间。如果您有特定的原因,您应该只修改 GC 策略。同样,您的分析器的输出看起来很典型。我不会认为有任何问题。
  • 我想我还要补充一点,JVM 在启动时为堆分配内存。初始值和最大值可以使用一些 JVM 参数设置,但最终,无论应用程序是否实际使用它,该内存都是为 JVM 保留的。如果您的初始堆大小为 100MB,而您只使用 20,则 windows 仍为 JVM 保留 100MB。最大堆大小可以随着程序需要更多而增长,直到最大值。这些参数分别是 Max 和 initial 的 -Xmx 和 -Xms。

标签: java multithreading memory garbage-collection heap-memory


【解决方案1】:

看起来有些东西正在被垃圾收集。请记住,在具有实际主内存量的计算机上,该斜率会显得小一千倍。我认为这不值得担心。

【讨论】:

    【解决方案2】:

    您的内存使用量在 0 到 20MB 之间波动,并且没有增加。既没有内存泄漏,也没有任何你应该注意这一点的理由。

    【讨论】:

      【解决方案3】:

      如果您使用visualvm 或jconsole 或jmc 来监控堆使用情况,它会使用RMI 和JMX,这会产生大量垃圾。即是您的监控在执行此操作。

      顺便说一句,即使你有一个简单的程序

      System.in.read();
      

      这些工具将显示垃圾正在被创建,但不是由您的程序创建的。

      我建议你改用

      jps -lvm
      

      获取进程ID或pid

      jstat -gccause {pid} 10s
      

      监控内存使用情况。这也产生了少得多的少量垃圾。

      【讨论】:

      • Peter,在这种情况下,您不建议使用基于 JMX/RMI 的监控应用程序吗?
      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多