当前位置: 首页 > 知识库问答 >
问题:

在什么情况下,Java 性能会随着内存的增加而降低?

唐高朗
2023-03-14

我们正在DEV环境中对 Java 1.6应用程序进行负载测试。JVM堆分配为2Gb,-Xms2048m-Xmx2048m。在负载测试下,应用程序运行流畅,从不使用超过1.25Gb的堆,垃圾回收机制完全正常。

在我们的UAT环境中,我们使用相同的参数运行负载测试,唯一的区别是JVM,它分配了4Gb,-Xms4096m -Xmx4096m,否则,硬件与DEV完全相同。但是在负载测试期间,性能是可怕的,应用程序几乎吃掉了整个堆,垃圾收集运行猖獗。

我们一遍又一遍地运行这些测试,消除了所有可能影响性能的症状,但结果是一样的。在什么情况下会这样?

共有3个答案

葛修筠
2023-03-14

值得分析这两台机器上的堆转储,并了解在这两种环境中是什么在不同地消耗堆。直方图会有帮助。

卢英叡
2023-03-14

罪魁祸首可能是垃圾回收,正常的“停止世界”类型的收集给我们带来了一些性能问题;服务器软件运行非常缓慢,但服务器的负载也很低。最终我们发现,有一个“停止世界”的垃圾收集器线程在特定情况下(产生大量垃圾的操作)一直保持整个软件的运行。

移动到并发垃圾收集缓解了启动参数-XX:UseParallelOldGC-XX:ParallelGCThreads=8的问题。我们在测试和生产中只使用了“2gb”堆,但值得注意的是,GC所需的时间随着堆的增大而增加(即使您的软件从未实际使用过所有堆)。

您可能想从这里了解更多关于不同垃圾收集器选项和调优的信息:Java SE 6 HotSpot[tm]虚拟机垃圾收集调优。

此外,这个问题的答案可以提供一些帮助:Java非常大的堆大小。

南宫浩皛
2023-03-14

生产环境和UAT环境中的应用程序有些不同。

从症状来看,不太可能是硬件、操作系统性能调整或JVM版本的差异。不言而喻,这不太可能是由于应用程序有更多的内存。

(你的应用程序可能会做一些奇怪的事情,比如根据最大堆大小调整某些数据结构的大小,从而导致计算错误,这不是不可想象的。但我想你应该意识到这种可能性,所以现在就忽略它吧。)

这可能与操作系统环境的差异有关;例如,操作系统或某个应用程序的不同版本、网络的差异、语言环境的差异等。但底线是,99%确定在UAT上运行时应用程序中有内存泄漏,而内存泄漏就是占用堆内存和GC过载的原因。

我的建议是将此视为存储泄漏问题,并使用标准工具/技术来跟踪问题的原因。在这个过程中,你很可能会弄清楚为什么这种情况只发生在你的UAT上。

 类似资料:
  • 我有一个正在运行的Spark Streaming应用程序,它使用mapWithState函数来跟踪RDD的状态。该应用程序可以正常运行几分钟,但随后会崩溃 我观察到,Spark应用程序的内存使用量随着时间的推移呈线性增加,尽管我已经为mapWithStateRDD设置了超时。请参阅下面的代码片段和内存使用情况- 如果每个RDD都有一个显式超时,为什么内存会随着时间线性增加? 我已经尝试增加内存,但

  • 我的公司使用liquibase来跟踪数据库的变化。每天大约有100个新的变更集被添加。根据我对已经执行的变更集的理解,liquibase再次计算校验和,并将其与databasechangelog表中的校验和进行比较,以查看校验和是否已更改,如果更改,则给出校验和问题。 因此,在几个月后,当我已经执行了大量变更集时,如果我添加了一个新的变更集,那么计算已经执行的变更集的校验和并对它们进行比较的过程是

  • 问题内容: 今天,在浏览各种问题时,我遇到了一个问题,在我看来有点不可思议,为什么一个人要在上面加上a ,对于这种情况会不会有什么真正的原因,所以这只是微不足道的吗? 问题答案: 动画图像作为GUI的BG。我使用HTML来调整此尺寸(x3),但是如果它已经是所需的尺寸,则可以直接将其设置为标签的。 不知道它是否是“真正的”。这似乎是一个主观术语,需要更多说明。我从来没有使用过这种方法,只是想通了,

  • 我正在centos 6上运行java应用程序,使用G1GC运行openjdk版本“1.8.0_232”。我看到堆的总使用量逐渐增加,导致应用程序崩溃。当我对活动对象进行堆转储时,转储大小仅为1.6GB,但我使用的总堆容量为32GB。 用于获取dump:jmap-dump:live、format=b、file=/tmp/dump的命令。hprof 从某个地方读到,jmap dump命令会触发一个完整

  • 本文向大家介绍请问java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况?相关面试题,主要包含被问及请问java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况?时的应答技巧和注意事项,需要的朋友参考一下 考察点:内存泄漏 Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。  

  • 为什么gcc在上的末尾插入了,而我却要自己在上添加? 从:

  • 本文向大家介绍datanode在什么情况下不会备份相关面试题,主要包含被问及datanode在什么情况下不会备份时的应答技巧和注意事项,需要的朋友参考一下 解答: 当分备份数为1时。

  • 本文向大家介绍在什么情况下选择webpack?在什么情况下选择rollup?相关面试题,主要包含被问及在什么情况下选择webpack?在什么情况下选择rollup?时的应答技巧和注意事项,需要的朋友参考一下 非要一句话区分的话 如果是用,如果是用其实界限并不是特别明显。在某些特殊情况下可以互用