jvm调优,内存管理

preview
需积分: 0 1 下载量 8 浏览量 更新于2017-01-01 收藏 877KB PDF 举报
### JVM调优与内存管理详解 #### 调优目标及基本概念 在进行JVM调优时,首要目标是确保应用程序能够高效稳定地运行。这通常涉及到几个关键指标:吞吐量(Throughput)、延迟(Latency)等。其中,**吞吐量**指的是单位时间内处理的工作量,而**延迟**则是指单个任务从开始到完成所需的时间。不同的应用场景可能会对这些指标有不同的侧重。 #### 测量工具 进行JVM调优前,我们需要借助一系列的工具来帮助我们了解当前系统的状态和瓶颈所在。常见的测量工具有: - **GC Log**: 用于记录垃圾回收的日志信息,通过分析这些日志可以帮助我们理解GC的行为模式及其效率。 - **jstat**: 提供了实时的JVM统计信息,包括堆内存使用情况、GC活动等。 - **jmap**: 用于获取堆内存的快照,帮助定位内存泄漏等问题。 - **sar/top**: 这些系统监控工具能够提供系统的负载、CPU利用率、I/O使用情况等信息,有助于综合判断系统整体性能。 #### 调优步骤 调优的过程可以概括为以下几个步骤: 1. **测量(Measure)**: 使用上述工具收集当前系统的性能数据。 2. **设定目标(Set Goal)**: 根据应用需求确定具体的优化目标,比如提高吞吐量或降低延迟。 3. **调优(Tuning)**: 根据收集的数据和设定的目标进行实际的调整工作。 4. **再次测量(Measure)**: 调整后再次收集数据,评估调优效果。 #### 调优因素 调优过程中需要关注的因素包括但不限于: - **GC因素**: - **内存占用(Footprint)**: 系统的内存占用情况。 - **分配速率(Allocate Rate)**: 对象创建的速度。 - **持久代大小(Live Data Size, LDS)**: 当前活跃数据的总大小。 - **暂停时间(Pause Time)**: GC执行时暂停其他操作的时间。 - **吞吐量(Throughput)**: 应用程序执行有效工作的比例。 - **应用程序因素**: - **响应时间(Response Time)**: 请求的处理时间。 - **每秒查询率(QPS)**: 单位时间内处理的查询数量。 - **系统因素**: - **负载(Load)**: 系统的整体负载情况。 - **CPU利用率(CPU)**: CPU的使用率。 - **I/O**: 输入输出设备的使用情况。 #### JVM选择 - **32位 vs 64位**: 在Linux环境下,32位JVM存在3GB的地址空间限制,因此建议将堆内存控制在2GB以下。而64位虽然指针占用内存更多,但在内存和CPU资源充足的情况下,通常推荐使用64位版本,并且应该启用`-XX:+UseCompressedOOPS`来节省内存开销。 #### GC选择 - **吞吐量优先**: 如果吞吐量更重要,则可以选择使用Parallel Old GC。 - **延迟优先**: 如果延迟更为关键,通常先尝试使用Parallel Old GC,如果不满足要求,则可以考虑使用CMS GC。 #### 调优模式 - **降低FGC执行频率**: - 增大Old区的大小,但需要注意避免造成其它问题。 - 适当增大整个堆内存大小。 - 减少对象从新生代向老年代的晋升,可以通过调整`TenuringThreshold`和`SurvivorSpaceSize`实现。 - **减小FGC造成的暂停时间**: - 减小堆内存大小。 - 将GC策略改为CMS。 - 升级或增加CPU资源。 - **降低YGC的执行频率**: - 增大新生代大小,注意这可能会导致Full GC变得更频繁。 - **缩短YGC造成的暂停时间**: - 减小新生代大小,可能会导致更多对象晋升到老年代。 - 增加或升级CPU。 #### 经验分享 - **Parallel Old GC调优**: - 根据具体的应用需求决定是否启用AdaptiveSizePolicy。 - 利用NUMA特性优化性能。 - **CMS GC调优**: - **TenuringThreshold调优**: TenuringThreshold越大,晋升到老年代的对象可能越少,但YGC耗时可能增加;反之亦然。 - **SurvivorSize调优**: 当大量对象晋升到Old区时,可能会延长YGC时间,这时可以考虑增加SurvivorSpace的大小。 - **避免promotion failed和concurrent mode failure**: 可以通过调整SurvivorSpace大小或增大Old区来降低这两种情况的发生几率。 - **GCCycleInitiation调优**: 控制Live Data Size和分配速率,避免过早或过晚触发GC。 通过上述步骤和技术细节的介绍,我们可以看到JVM调优是一项复杂而又细致的工作,需要根据具体情况灵活运用各种技术和策略,才能达到最佳的性能优化效果。