JVM内存参数
-Xms
初始堆大小,默认为物理内存的1/64(<1GB),一般设置为与Xmx同样大小,防止扩容时内存抖动。
-Xmx
最大堆大小,默认为物理内存的1/4(<1GB) 。
-Xss
每个线程的堆栈大小,如果栈不是很深,应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。
GC参数
-XX:SurvivorRatio
Eden和Survivor的比值,默认8:1,即8
-XX:NewRatio
老年代和年轻代内存大小比例
-XX:MaxTenuringThreshold
对象从年轻代晋升到老年代经过GC次数的最大阈值
垃圾收集器选择
年轻代收集器
Serial收集器(-XX:+UseSerialGC,复制算法)
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,Client模式下默认的年轻代收集器
ParNew收集器(-XX:+UseParNewGC,复制算法)
- 多线程收集,其余行为特点与Serial一样
- 单核执行效率不如Serial,在多核下执行才有优势。
Parallel Scavenge收集器(-XX:+UseParallelGC,复制算法)
Tips: 程序吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
- 比起关注用户线程停顿时间,更关注系统的吞吐量
- 多核才有优势,Server模式下默认的年轻代收集器。
老年代收集器
Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,Server模式下默认的老年代收集器
Parallel Old收集器(-XX:+UseParallelOldGC,标记-整理算法)
- 多线程,吞吐量优先
CMS收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)
- 停顿时间短
- 标记-清除算法使得该垃圾收集器会产生较多内存碎片
G1(Garbage First)收集器(-XX:+UseG1GC,复制+标记-整理算法)
- 年轻代老年代不再物理隔离,仅逻辑隔离
- 并行并发、分代收集、空间整合、可预测的停顿