JVM 将内存划分为:(通过配置合理的 jvm 各内存大小)
- New(年轻代)
- Tenured(年老代)
永久代(Perm)
垃圾回收算法(通过配置合适垃圾回收算法进行调优)
垃圾回收算法可以分为三类, 都基于标记 - 清除 (复制) 算法:
Serial 算法(单线程)
并行算法
并发算法
性能调优
对程序及 JVM 进行调优. 从以下几个方面进行:
线程池: 解决用户响应时间长的问题
连接池
: 调整各代的内存比例和垃圾回收算法, 提高吞吐量
程序算法: 改进程序逻辑算法提高性能
调优方法
原则:
1, 多数的 Java 应用不需要在服务器上进行 GC 优化;
2, 多数导致 GC 问题的 Java 应用, 都不是因为我们参数设置错误, 而是代码问题;
3, 在应用上线之前, 先考虑将机器的 JVM 参数设置到最优(最适合);
4, 减少创建对象的数量;
5, 减少使用全局变量和大对象;
6,GC 优化是到最后不得已才采用的手段;
7, 在实际使用中, 分析 GC 情况优化代码比优化 GC 参数要多得多;
GC 优化的目的有两个:
1, 将转移到老年代的对象数量降低到最小;
2, 减少 full GC 的执行时间;
为了达到上面的目的, 一般地, 你需要做的事情有:
1, 减少使用全局变量和大对象;
2, 调整新生代的大小到最合适;
3, 设置老年代的大小为最合适;
4, 选择合适的 GC 收集器;
在上面的 4 条方法中, 用了几个 "合适", 那究竟什么才算合适, 一般的, 请参考上面 "收集器搭配" 和 "启动内存分配" 两节中的建议. 但这些建议不是万能的, 需要根据您的机器和应用情况进行发展和变化, 实际操作中, 可以将两台机器分别设置成不同的 GC 参数, 并且进行对比, 选用那些确实提高了性能或减少了 GC 时间的参数.
真正熟练的使用 GC 调优, 是建立在多次进行 GC 监控和调优的实战经验上的, 进行监控和调优的一般步骤为:
1, 监控 GC 的状态
使用各种 JVM 工具, 查看当前日志, 分析当前 JVM 参数设置, 并且分析当前堆内存快照和 gc 日志, 根据实际的各区域内存划分和 GC 执行时间, 觉得是否进行优化;
2, 分析结果, 判断是否需要优化
如果各项参数设置合理, 系统没有超时日志出现, GC 频率不高, GC 耗时不高, 那么没有必要进行 GC 优化; 如果 GC 时间超过 1-3 秒, 或者频繁 GC, 则必须优化;
注: 如果满足下面的指标, 则一般不需要进行 GC:
Minor GC 执行时间不到 50ms;
Minor GC 执行不频繁, 约 10 秒一次;
Full GC 执行时间不到 1s;
Full GC 执行频率不算频繁, 不低于 10 分钟 1 次;
3, 调整 GC 类型和内存分配
如果内存分配过大或过小, 或者采用的 GC 收集器比较慢, 则应该优先调整这些参数, 并且先找 1 台或几台机器进行 beta, 然后比较优化过的机器和没有优化的机器的性能对比, 并有针对性的做出最后选择;
4, 不断的分析和调整
通过不断的试验和试错, 分析并找到最合适的参数
5, 全面应用参数
如果找到了最合适的参数, 则将这些参数应用到所有服务器, 并进行后续跟踪.
JVM 调优
来源: http://www.bubuko.com/infodetail-3002476.html