我已经在glassfish服务器上部署了我的jruby应用程序的war文件。我注意到我的应用程序随着时间的推移变得很慢。我的服务器有30GB的RAM,但应用程序仍然很慢。
我的应用程序中的每个 ruby 方法都在创建包含大约 1 百万条记录的数组。我认为创建这么大的数组会导致内存问题,因此应用程序变慢。如果这是真的,那么可以做什么设置来避免这样的内存问题。
以下是我的 Java 内存设置
uintx AdaptivePermSizeWeight = 20 {product}
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 1055640320 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 16890462208 {product}
uintx MaxPermSize = 174063616 {pd product}
uintx PermSize = 21757952 {pd product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.7.0_101"
OpenJDK Runtime Environment (IcedTea 2.6.6) (7u101-2.6.6-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
谢谢
答案1
我建议在生产环境中使用 -server 选项设置 Xms16G Xms16G。需要一些指标来帮助识别问题,当服务器开始变慢时提供以下信息:
Java 进程的系统内存(顶部的 RSS)
PermGen 大小(使用 jmc 或 jvisualm)
CodeCahe 大小(使用 jmc):可能该问题还打印最大大小(java -XX:+PrintFlagsFinal | grep ReservedCodeCacheSize)。