java - 在我的 tomcat pid 上运行 jmap 的说明

标签 java tomcat jvm heap-memory

我在顶部修改了我的 catalina.sh:

export CATALINA_OPTS="-Xms512m -Xmx1500m"

我的服务器上有 4GB 内存,我正在进行负载测试,所以我几乎想把所有东西都交给 tomcat。

我应该调整哪些其他 JVM 设置以最大化每秒请求数?

PerMem 也很重要吗?

我对下面的 jmap 输出有点困惑。

我将 Xmx 设置为 1500megs,它似乎已经更新,因为我看到“maxheapsize”是 1500m。

但是它在哪里显示我已经使用了多少堆以及有多少是空闲的?

我看到堆使用 63mb (eden),那是什么?

enter image description here

最佳答案

热点(读太阳)堆被分成几个部分,所以当您指定 -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/

相关文章:

java - "Requested array size exceeds VM limit"位于 java.io.PrintWriter.newLine

JavaFX TableView 单击标题

rest - 如何对用户进行身份验证并将其重定向到 Jersey REST 服务中的 'own' 页面

java - 解释字节码与编译字节码?

Grails Taglib 用于列出当前登录用户的最后事件

java - Firebase Realtime 在类 java.lang.CharSequence 上找不到要序列化的属性

java - C 编译器对架构的依赖

java - Tomcat 7 上的 URL 丢失应用程序名称

java - Tomcat java.lang.OutOfMemoryError : GC overhead limit exceeded 错误

jvm - 使用 invokespecial 调用公共(public)方法?