我是分析 Java 内存问题的新手。如果这个问题看起来很幼稚,请原谅我
我的应用程序运行时设置了以下 JVM 参数:
-Xms3072m -Xmx3072m
-XX:MaxNewSize=1008m -XX:NewSize=1008m
-XX:PermSize=224m -XX:MaxPermSize=224m -XX:SurvivorRatio=6
我正在使用 VisualVM 来监控使用情况:这是我所看到的
问题是,即使应用程序没有接收任何数据进行处理,所使用的内存也不会减少。当应用程序启动时,已用空间一开始很低(大约 1GB),但随着应用程序运行而增长。然后使用的内存永远不会减少。
我的问题是,为什么即使应用程序中没有发生重大处理,使用的堆内存也不会下降,以及可以设置哪些配置来纠正它。
我的理解是,如果应用程序不进行任何处理,那么使用的堆应该更少,并且在这种情况下可用堆内存(或最大堆)应该保持不变(3GB)。
这是一种完全正常的趋势,即使您认为它没有被使用,也可能有线程正在运行,执行创建对象的任务。unreferenced
一旦任务完成,这些对象就有资格进行下一次 GC,但只要没有minor/major GC
它们在你的堆中占用越来越多的空间,因此它会一直上升,直到触发 GC,然后你才能获得正常的堆大小,依此类推。
异常趋势也是同样的情况,但在 GC 后,堆大小将高于前一次 GC 后的堆大小,但这里的情况并非如此。
您真正的问题是,当我的应用程序没有收到任何要处理的数据时,我的应用程序正在做什么?为此,线程转储应该有所帮助,您可以启动jcmd
获取 PID 然后启动jstack $pid
获取线程转储。
以下是内存泄漏的典型趋势示例:
正如您所看到的,起始堆大小在两次 GC 之间发生了变化,新的起始堆大小比前一个更大,这可能是由于内存泄漏造成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)