- 哪些对象会被存放在老年代
- 新生代对象每次经历一次minor gc,年龄就会加1,当达到年龄阈值(默认为15岁),会直接进入老年代
- 大对象直接进入老年代
- 新生代复制算法需要一个survivor区进行轮换备份,如果出现大量对象在minor GC后仍然存活的情况时,就需要老年代进行分配担保,让survivor无法容纳的对象直接进入老年代
- 如果在survivor空间中相同年龄所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代
- 什么时候触发full GC
- 调用System.gc时。系统建议执行full gc,但是不必然执行
- 老年代空间不足
- 方法区空间不足
- 通过Minor GC 后进入到老年代的平均大小大于老年代的可用内存
- 由Eden区,From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
- JVM调优经验和方案
- 调优时机:
- heap内存(老年代)持续上涨到设置的最大内存值
- Full GC 次数频繁
- GC停顿时间过长(超过1秒)
- 应用出现OOM等内存异常
- 应用中有使用本地缓存且占用大量内存空间
- 系统吞吐量与响应性能不高或下降
- 调优原则:
- 多数的java应用不需要在服务器上进行JVM优化
- 多数导致GC问题的java应用,都不是因为我们参数设置错误,而是代码问题
- 在应用上线之前,先考虑将机器的JVM参数设置到最优(最合适)
- 减少创建对象的数量
- 减少使用全局变量和大对象
- JVM优化是到最后不得已才采用的手段
- 在实际应用中,分析GC情况优化代码比优化JVM参数更好
- 调优目标
- GC低停顿
- GC低频率
- 低内存占用
- 高吞吐量
- 调优步骤
- 分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点
- 确定JVM调优量化目标
- 确定JVM调优参数(根据历史JVM参数来调整)
- 调优一台服务器,对比观察调优前后的差异
- 不断地分析和调整,直到找到合适的JVM参数配置
- 找到合适的参数,将这些参数应用到所有服务器,并进行后续跟踪
E-->