我需要设置一个Oracle Glassfish 服务器经过一番研究,我提出了一个配置方案。欢迎提出任何建议和/或更正。
我的硬件/操作系统(相关)详细信息:
- Ubuntu 12.04 LTS 64 位
- JDK 7.0.28
- 内存 12GB
- 4处理器(每根 6 芯)
我的 JVM 选项
- -服务器
- -Xms9g
- -Xmn1g (问题 1)
- -Xmx9g
- -Xss128k(第二季度)
- -XX:+UseCompressedOops
- -XX:+DisableExplicitGC
- -XX:+UseConcMarkSweepGC
- -XX:ParallelGCThreads=18
- -XX:+使用并行旧GC
- -XX:幸存者比例=8(第三季度)
- -XX:最大阈值=15(Q4)
- -XX:MaxPermSize=1g(问5)
- -XX:永久大小=512m
问题 1- 有人建议 33% ( -XX:NewRatio=3
) 的比例,这样可以得到 3g伊甸园。对于 GC(具有 18 个线程)来说,这个空间是不是太大了,难以清理?
第二季度- 我找不到一个好的值。
第三季度- 这是默认比例。有人说这个选项不会改变性能。
Q4- 与问题 3 相同。
问5- 不知道这个值是多少。
答案1
您应该添加 JVM/GC 日志记录选项,这将允许您跟踪 GC 活动并帮助您确定 Q1、Q3、Q4、Q5 的最佳值。此外,GC 日志记录几乎没有开销,因此您可以在生产环境中安全地使用它:
JVM/GC 日志记录例如通过以下方式启用: -XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
问题 1:如果总堆大小为 9GB,那么 3GB 的 YounGen 大小并不算太大。您需要检查 GC 日志以查看最佳大小。
问题2: 这大概就足够了,你也可以测试一下-Xss256k
。
问题3:-XX:SurvivorRatio
除非您使用 ,否则将忽略该选项-XX-UseAdaptiveSizePolicy
,这就是人们看不到此选项效果的原因。还请考虑-XX:InitialSurvivorRatio=3
和-XX:TargetSurvivorRatio=90
。但请谨慎禁用自适应尺寸,并且只有当您知道自己在做什么时才这样做。
问题4:这是一个正确的值,尽管我还没有看到它的效果。GC 可能会决定更早地提升对象。用于-XX:+PrintTenuringDistribution
监视这一点。
问题5:您可以从显示 PermGen 占用情况的 GC 日志中确定这一点。
其他参数您可以考虑:
-XX:+AggressiveOpts
-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC
用于调试 GC 问题-XX:-UseBiasedLocking
- 通常建议应用服务器禁用偏向锁-XX:+UseLargePages
- 这将有助于提高您的性能,但您也需要在操作系统中进行配置。
一些有用的提示可以在Java 性能书。