Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java VisualVM:理想堆内存使用图_Java_Performance_Heap Memory_Visualvm - Fatal编程技术网

Java VisualVM:理想堆内存使用图

Java VisualVM:理想堆内存使用图,java,performance,heap-memory,visualvm,Java,Performance,Heap Memory,Visualvm,我正在使用VisualVM监控我的Java应用程序(用jdk1.7编写)。下图显示了此应用程序运行期间的堆内存使用情况 看看这张图,你会发现里面有很多尖峰。这些尖峰表示应用程序创建了对象。一旦应用程序处理完它们,它就会使用gc(在本例中隐式调用)销毁它们 另外,这里是应用程序仍在运行时内存分析器的屏幕截图 对我来说,图形的上下特性表明java对象的有效使用。这个推论正确吗? 堆使用率图的理想性质是什么 我的应用程序是否还有其他方法可以提高堆内存使用率?只要堆大小随时间保持几乎相同,就可以了。

我正在使用
VisualVM
监控我的Java应用程序(用
jdk1.7
编写)。下图显示了此应用程序运行期间的堆内存使用情况

看看这张图,你会发现里面有很多尖峰。这些尖峰表示应用程序创建了对象。一旦应用程序处理完它们,它就会使用gc(在本例中隐式调用)销毁它们

另外,这里是应用程序仍在运行时内存分析器的屏幕截图

对我来说,图形的上下特性表明java对象的有效使用。这个推论正确吗?

堆使用率图的理想性质是什么


我的应用程序是否还有其他方法可以提高堆内存使用率?

只要堆大小随时间保持几乎相同,就可以了。由于sunjvm中暂停世界gc的性质,使用的堆应该上下浮动。看起来你的应用程序中产生了很多短期对象,这可能效率低下,但有时你需要创建它们。这是Java的生活方式:D

对我来说,图形的上下特性表明java对象的有效使用。这个推论正确吗

我认为这是对垃圾收集器的有效利用。我建议创建更少的对象可能更有效

堆使用率图的理想性质是什么

这取决于你的申请。我倾向于选择一个几乎完全平坦的

有没有其他方法可以提高应用程序的堆内存使用率

装载

  • 创造更少的垃圾。使用内存探查器找出正在创建垃圾的位置
  • 使堆变大,这样它就不会经常使用GC
  • 将保留的数据移出堆(您似乎没有太多数据)

在您的情况下,最好的选择是减少正在产生的垃圾量。

随着时间的推移,右侧的许多尖峰显示程序会产生更多的短期对象。可能,这是可以优化的。您的内存使用看起来非常完美fine@VictorSorokinJVMGC可以很好地处理许多短期对象。这不是问题。@VictorSorokin这些尖峰确实表明,一旦对象超出其作用域,gc就会被隐式调用并杀死它们。实际上,这是不是问题,由OP来决定。一般来说,随着垃圾产生速度的加快,GC被调用的频率也会提高,从而从应用程序本身窃取CPU时间。我相信,OP对此并不在意,但在极端情况下,它可能会导致
OutOfMemory
:我实际上是在需要时重新创建相同java类型的对象。重用已创建但在不需要时取消初始化(然后设置为null)的对象是否有帮助。在这种情况下,jvm不会将它们标记为垃圾。因此,gc的调用频率会降低。@davison如果回收大部分对象,它可能会有所帮助。如果只回收顶级对象,可能没有帮助。如果你没有使用过像你的工具包这样的商业分析器,你可能会发现有10件事情需要首先优化。您可以获得工具包和其他探查器的评估许可证。如果我不测量,我只是猜测。@davison您可以通过使用索引循环来消除这些迭代器。