Java堆内存使用率波动

Java堆内存使用率波动,java,multithreading,memory,garbage-collection,heap-memory,Java,Multithreading,Memory,Garbage Collection,Heap Memory,亲爱的开发者们,大家好 我在java应用程序中面临堆内存使用问题。 应用程序本身只是简单地接受套接字连接 主线程我没有以下脚本(除了静态ExecutorService实例): 当应用程序运行时,它应该阻止循环,直到有人连接。。。 这意味着我的主线程大部分时间处于等待状态 问题是:当没有人连接到我的服务器时,堆内存使用率会波动(请参见下面的屏幕截图) 这意味着内存泄漏?不或者这是java应用程序的自然行为方式 提前感谢…看起来有东西被垃圾收集了。记住,在一台拥有真实内存量的计算机上,这个斜率会小

亲爱的开发者们,大家好

我在java应用程序中面临堆内存使用问题。 应用程序本身只是简单地接受套接字连接

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

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

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


提前感谢…

看起来有东西被垃圾收集了。记住,在一台拥有真实内存量的计算机上,这个斜率会小一千倍。我认为这不值得担心。

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

如果使用
visualvm
jconsole
jmc
来监视堆使用情况,它使用RMI和JMX,这会产生大量垃圾。i、 e.是您的监控在进行此操作

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

System.in.read();
这些工具将显示正在创建垃圾,但不是由程序创建的

我建议你试着改用

jps -lvm
获取进程id或
pid

jstat -gccause {pid} 10s

监视内存使用情况。这也会产生少量的垃圾,远远减少。

如果内存泄漏,使用率会增加。在我看来,这就像正常的GC活动一样。您可以使用各种JVM参数调整GC策略的攻击性,但这看起来很正常。我只想继续。感谢您澄清@Kayaman:)是的,有一个设置特别影响GC中CPU时间的百分比。默认设置允许堆增长直到接近最大值,然后GC将运行(我认为)。更积极的选择将在GC中花费更多的时间,因此在用户代码上花费更少的时间。只有当您有特定的理由修改GC策略时,才应该修改GC策略。同样,您的分析器的输出看起来非常典型。我不认为有任何问题。我想我还要补充一点,JVM在启动时为堆分配内存。可以使用一些JVM参数设置初始值和最大值,但最终,该内存将保留给JVM,而不管应用程序是否实际使用它。如果您的初始堆大小是100MB,而您只使用了20,那么windows仍然为JVM保留100MB。最大堆大小可以随着程序需要的增加而增加,直至达到最大值。对于Max和initial,这些参数分别是-Xmx和-Xms?
jstat -gccause {pid} 10s