Oracle HotSpot JVM 垃圾收集调优指南

需积分: 5 1 下载量 163 浏览量 更新于2024-06-22 收藏 720KB PDF 举报
"Oracle HotSpot虚拟机垃圾收集技术文档分享" Oracle HotSpot虚拟机是Java平台标准版(Java Platform, Standard Edition,简称Java SE)的一部分,它是一个高性能的Java虚拟机实现。该文档主要关注的是HotSpot VM的垃圾收集(Garbage Collection, GC)调优指南,适用于版本14。垃圾收集是Java内存管理的关键组成部分,负责自动释放不再使用的对象以回收内存空间,避免内存泄漏。 在Java中,内存分为堆(Heap)和栈(Stack)两大部分。堆主要用于存储对象实例,而栈则保存方法调用时的局部变量。HotSpot VM的垃圾收集主要发生在堆上,它有多种不同的GC算法,如串行GC、并行GC、并发标记清除(Concurrent Mark Sweep, CMS)、G1垃圾收集器以及最新的低暂停时间的ZGC和Shenandoah等。 1. **串行GC**:适合小型应用,它在一个单独的线程中执行垃圾收集,优点是简单且效率高,但会导致应用程序暂停时间较长。 2. **并行GC**:在多个CPU核心上并行进行,可以显著减少暂停时间,但可能会增加总体的系统资源消耗。 3. **CMS(并发标记清除)GC**:设计用于降低长时间停顿,它尝试将大部分工作与应用程序线程并发执行,只在必要的阶段暂停应用。CMS适合对响应时间要求较高的应用。 4. **G1(Garbage-First)GC**:是一个区域化(Region-based)的垃圾收集器,目标是达到可预测的暂停时间,同时保持高吞吐量。G1能智能地选择要清理的区域,并尝试最小化GC暂停。 5. **ZGC和Shenandoah**:是近年来引入的新一代低暂停时间的GC,它们的目标是在大内存环境中实现几乎无感知的垃圾收集。ZGC和Shenandoah都使用了颜色标记来追踪对象状态,从而减少了锁竞争和同步开销。 垃圾收集的调优主要包括以下几个方面: - **内存配置**:调整堆大小(新生代、老年代)、元空间大小等,确保内存分配合理。 - **GC策略选择**:根据应用的特性(如响应时间优先还是吞吐量优先)选择合适的垃圾收集器。 - **暂停时间目标**:设置垃圾收集的暂停时间限制,帮助VM自动调整其行为。 - **监控与诊断**:使用JMX、VisualVM或JFR等工具监控GC性能,找出可能的问题。 - **对象存活率**:了解应用中的对象生命周期,优化新生代和老年代的比例。 - **并发比**:调整并行GC或CMS的并发度,平衡CPU使用和暂停时间。 调优过程中需要注意的是,没有一种通用的最佳配置,每个应用都有其独特性,因此调优过程通常需要根据具体应用的行为和需求进行微调。理解垃圾收集的工作原理,结合应用的性能指标,才能有效地优化Java应用的内存管理,提高系统的稳定性和性能。

[23-05-29 20:39:13.243] {main} <proxy-cache> requires Resin Professional. Please see http://www.caucho.com for Resin Professional information and licensing. [23-05-29 20:39:13.400] {main} [23-05-29 20:39:13.400] {main} Resin-4.0.58 (built Fri, 24 Aug 2018 01:23:14 PDT) [23-05-29 20:39:13.401] {main} [23-05-29 20:39:13.402] {main} Windows 10 10.0 amd64 [23-05-29 20:39:13.402] {main} Java(TM) SE Runtime Environment 1.8.0_191-b12, GBK, zh [23-05-29 20:39:13.402] {main} Java HotSpot(TM) 64-Bit Server VM 25.191-b12, 64, mixed mode, Oracle Corporation [23-05-29 20:39:13.402] {main} [23-05-29 20:39:13.403] {main} user.name = WR182 [23-05-29 20:39:13.541] {main} [23-05-29 20:39:13.546] {main} server listening to 127.0.0.1:6800 [23-05-29 20:39:13.549] {main} [23-05-29 20:39:13.766] {main} Table[mnode:2,D:\WEAVER\Resin\resin-data\app-0\distcache\mnode.db] validating indexes due to unclean shutdown. [23-05-29 20:39:13.816] {main} Table[data:3,D:\WEAVER\Resin\resin-data\app-0\distcache\data.db] validating indexes due to unclean shutdown. [23-05-29 20:39:13.942] {main} [23-05-29 20:39:13.943] {main} resin.home = D:\WEAVER\Resin [23-05-29 20:39:13.943] {main} resin.root = D:\WEAVER\Resin [23-05-29 20:39:13.943] {main} resin.conf = d:\WEAVER\Resin\conf\resin.xml [23-05-29 20:39:13.943] {main} [23-05-29 20:39:13.943] {main} server = 127.0.0.1:6800 (app:app-0) [23-05-29 20:39:13.943] {main} stage = production [23-05-29 20:41:38.003] {main} Found library 'resin_os' as 'd:\WEAVER\Resin\win64\resin_os.dll', but the load failed. The JVM exception was: java.lang.UnsatisfiedLinkError: no resin_os in java.library.path [23-05-29 20:42:40.782] {resin-60} WebApp[production/webapp/default/lib] active [23-05-29 20:42:40.782] {main} Host[production/host/default] active [23-05-29 20:42:40.782] {main} ServletService[id=app-0,cluster=app] active [23-05-29 20:42:40.782] {main} [23-05-29 20:42:40.782] {main} http listening to *:8080 [23-05-29 20:42:40.782] {main} https listening to *:8444 [23-05-29 20:42:40.796] {main} [23-05-29 20:42:40.796] {main} Resin[id=app-0] started in 210426ms Connected to server [23-05-29 20:43:29.233] {resin-55} WebApp[production/webapp/default/ROOT] active

2023-05-30 上传