我在顶部修改了我的 catalina.sh:
export CATALINA_OPTS="-Xms512m -Xmx1500m"
我的服务器上有 4GB 内存,我正在进行负载测试,所以我几乎想把所有东西都交给 tomcat。
我应该调整哪些其他 JVM 设置以最大化每秒请求数?
PerMem 也很重要吗?
我对下面的 jmap 输出有点困惑。
我将 Xmx 设置为 1500megs,它似乎已经更新,因为我看到“maxheapsize”是 1500m。
但是它在哪里显示我已经使用了多少堆以及有多少是空闲的?
我看到堆使用 63mb (eden),那是什么?
最佳答案
热点(读太阳)堆被分成几个部分,所以当您指定 -Xmx 时,您实际上是在为整个堆设置最大值,而不是它的一部分。
Eden 是整个堆的一小部分,它保持较小是为了确保应用程序在收集期间不会长时间停止。所有新对象(适合的)首先进入伊甸园,如果它们不是垃圾,它们将被提升到幸存者空间或任期。
Survivor(To/From 空间)是 GC 尝试获取可能是垃圾的对象的地方,但在伊甸园收集期间无法快速解决,有两个幸存者空间充当缓冲区,作为一个一个由 GC 填充,另一个由 tenure 消耗,如果你看图表,你会看到这两个空间的使用率在翻转。
Tenure 是长期存在的对象所在的地方,这个堆通常非常大,并且通过与 eden 不同的算法收集。
Perm 在某种程度上与堆的其余部分是分开的,它是常量字符串(任何已被“interned”的字符串)和类字节码所在的地方。您很少需要调整它,通常只需要为大型应用程序或(严重)自动生成代码的应用程序增加它。
如果没有暂停时间,我无法确定您的 JVM 设置是否完全正确,但从您的堆大小来看,您似乎使用了大约 1.2 Gb 的分配空间。除非你的应用程序看到任何令人讨厌的停顿,否则我认为你已经完成了 GC 调优(人们经常带着大量的标志去镇上而不真正理解它们的作用,在你向自己证明它们是需要)
您的目标是在 Web 应用程序上实现低延迟,因此使用 ConcurrentMarkSweep 作为任期收集器是一个明智的选择。
关于java - 在我的 tomcat pid 上运行 jmap 的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8598878/