我目前正在为客户端站点(Java语言)使用Adobe Experience Manager。它采用OpenJDK的:Adobe Experience Manager(AEM),Java垃圾回收调整和内存管理
#java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
它是Rackspace公司运行具有以下内容:
vCPU: 4
Memory: 16GB
Guest OS: Red Hat Enterprise Linux 6 (64-bit)
既然已经在生产中我一直在经历上的应用程序的一部分很慢的性能。这就像我启动应用程序,一切都很顺利,然后3到4天后,CPU使用率达到400%(每天约4000人)。我有一些OOM例外(1或2),但大多数网站特别慢,并且永远不会成为OOM例外。因为我是Java内存管理的新手,所以我开始阅读它是如何工作的,并发现了诸如jstat之类的工具。当系统被淹没围绕第二时间,我跑:
#top
得到的java程序的PID,然后压移+ H,并指出与高CPU百分比螺纹的PID。然后我跑
#sudo -uaem jstat <PID>
有一个线程转储和转换线的PID我以前写下来,搜索转储其十六进制值。毕竟,我终于发现,垃圾收集器出于某种原因正在翻转出来并不奇怪。
我开始阅读很多关于Java GC调优的知识,并提出了以下java选项。 所以重新启动与以下选项的应用程序:
java
-Dcom.day.crx.persistence.tar.IndexMergeDelay=0
-Djackrabbit.maxQueuedEvents=1000000
-Djava.io.tmpdir=/srv/aem/tmp/
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/srv/aem/tmp/
-Xms8192m -Xmx8192m
-XX:PermSize=256m
-XX:MaxPermSize=1024m
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:ParallelGCThreads=4
-XX:NewRatio=1
-Djava.awt.headless=true
-server
-Dsling.run.modes=publish
-jar crx-quickstart/app/cq-quickstart-6.0.0-standalone.jar start
-c crx-quickstart -i launchpad -p 4503
-Dsling.properties=conf/sling.properties
它看起来像它正在执行的要好得多,但我认为,它可能需要更多的GC优化。
当我运行:
#sudo -uaem jstat <PID> -gcutils
我得到这个:
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 55.97 100.00 45.09 4725 521.233 505 4179.584 4700.817
后第4天,我重新启动它。
当我运行:
#sudo -uaem jstat <PID> -gccapacity
我得到这个:
NGCMN NGCMX NGC S0C S1C EC
4194304.0 4194304.0 4194304.0 272896.0 279040.0 3636224.0
OGCMN OGCMX OGC OC PGCMN PGCMX
4194304.0 4194304.0 4194304.0 4194304.0 262144.0 1048576.0
PGC PC YGC FGC
262144.0 262144.0 4725 509
后第4天,我重新启动它。
这些结果比我开始时好得多,但我认为它会变得更好。我不确定接下来该做什么,因为我不是GC专业人员,所以我想知道你们是否会对我有任何提示或建议,以获得更好的应用程序/ GC性能,以及如果比例和youngGen和oldGen的大小?
我应该如何设置幸存者和伊甸园的大小/比率? 我是否应该像使用CMS GC或G1一样更改GC类型? 我应该如何继续?
任何建议都会有所帮助。
最佳,
尼古拉
谢谢莫汉这是非常有帮助的。所以尝试1:3(年轻:老)与G1和8MB可以尝试? – nabello
是的。这是值得尝试的。你的意思是8GB我猜上面。 –
我仍在收集信息,但尚未解决此问题。由于它是一个生产环境,我无法测试您的建议。 – nabello