首页 > 其他分享 >JVM参数系列解析

JVM参数系列解析

时间:2024-07-12 19:08:28浏览次数:16  
标签:回收 XX 参数 垃圾 JVM GC 解析 CMS

-XX:+UseCompressedOops

Java SE 6U23 开始,JVM会默认开启压缩指针。

JVM之压缩指针(CompressedOops)

-XX: + DisableExplicitGC

强制禁用手动gc

Java虚拟机System.gc()解析

CMS系列

-XX:+UseParNewGC

-XX:+UseParNewGC 是一个与Java虚拟机(JVM)垃圾回收策略相关的命令行选项,用于指定使用ParNew垃圾回收器作为年轻代(Young Generation)的垃圾回收算法。ParNew是并行(Parallel)版本的新一代(New Generation)垃圾回收器,它是Serial收集器的并行版本,主要设计目标是在多核处理器环境下通过并行化垃圾回收过程来缩短垃圾回收暂停时间,从而提高应用程序的响应速度。
ParNew垃圾回收器的特点包括:
并行回收:ParNew回收器在垃圾回收过程中利用多核CPU的能力,通过并行执行多个垃圾回收线程来加速垃圾回收过程,减少应用程序的暂停时间。
适合多核处理器:由于ParNew充分利用了多核处理器的并行计算能力,因此在现代多核服务器上表现尤为出色。
与CMS配合使用:ParNew经常与Concurrent Mark Sweep (CMS)回收器一起使用,作为年轻代的垃圾回收器,而CMS则负责老年代(Old Generation)的垃圾回收。这种组合在追求低暂停时间的应用场景中非常受欢迎。
可配置的线程数:用户可以通过 -XX:ParallelGCThreads 参数来指定用于垃圾回收的线程数量,以适应不同硬件环境和应用需求。
然而,ParNew垃圾回收器也有其局限性。例如,虽然它减少了暂停时间,但可能并不总是能最大化吞吐量,因为过多的并行线程可能会导致CPU缓存不一致和上下文切换开销。此外,ParNew回收器在JDK 9之后已被标记为废弃,并在JDK 15中被彻底移除,取而代之的是G1垃圾回收器和其他更先进的回收策略。
因此,对于使用较新版本JDK的应用程序,推荐使用G1垃圾回收器或根据具体需求选择其他适合的垃圾回收策略。G1回收器不仅提供了并行和并发的垃圾回收能力,还支持混合垃圾回收,能够更好地平衡暂停时间和吞吐量,适合各种规模和类型的Java应用程序。

-XX:+UseConcMarkSweepGC

-XX:+UseConcMarkSweepGC 是一个与Java虚拟机(JVM)垃圾回收策略相关的命令行选项,用于指定使用Concurrent Mark Sweep (CMS)垃圾回收器。不过,自JDK 9起,该选项已被重命名为 -XX:+UseConcurrentMarkSweepGC 以符合命名规范,但旧的 -XX:+UseConcMarkSweepGC 仍被保留以保持向后兼容性。
CMS垃圾回收器是专门为减少全局停顿时间设计的,非常适合那些对响应时间有严格要求的应用程序。它通过在应用程序运行的同时执行大部分的标记和清除工作,从而避免了长时间的垃圾回收停顿,使得应用程序能够更加平滑地运行。
CMS回收器的主要特点包括:
并发标记:在应用程序继续运行的同时,CMS回收器会执行对象的标记过程,这减少了全局停顿时间。
并发清除:同样地,CMS回收器在应用程序运行时执行清除过程,但这通常需要一次短暂的停顿,用于处理剩余的引用和完成清除。
低内存碎片:CMS回收器倾向于产生较少的内存碎片,因为它采用的是“标记-清除”算法,而不是“复制”算法。
可预测的停顿时间:CMS回收器试图提供可预测的停顿时间,这对于实时系统非常重要。
然而,CMS回收器也有一些缺点,比如它可能会导致CPU使用率的激增,因为它在应用程序运行时执行大部分的回收工作。此外,CMS回收器不擅长处理高并发的写操作,因为这会增加“remark”阶段的停顿时间。
自JDK 9开始,CMS回收器已被标记为“deprecated”,并最终在JDK 15中被完全移除。取而代之的是G1垃圾回收器,它提供了更好的性能和更稳定的停顿时间。因此,对于现代的Java应用程序,推荐使用G1回收器或其他更先进的垃圾回收策略,而不是CMS回收器。
总结来说,-XX:+UseConcMarkSweepGC / -XX:+UseConcurrentMarkSweepGC 选项用于指定使用CMS垃圾回收器,但鉴于其已被弃用,现代Java应用程序应考虑使用更先进的垃圾回收器。

-XX:+UseCMSInitiatingOccupancyOnly

-XX:+UseCMSInitiatingOccupancyOnly 是一个与Java虚拟机(JVM)的垃圾回收(GC)策略相关的命令行选项,它特定于使用并发标记清除(Concurrent Mark Sweep, CMS)垃圾回收器的场景。
当启用 -XX:+UseCMSInitiatingOccupancyOnly 选项时,JVM 将始终使用由 -XX:CMSInitiatingOccupancyFraction 参数指定的阈值来触发 CMS 垃圾回收过程。这个阈值表示老年代(Old Generation)堆空间的占用百分比,一旦达到或超过这个百分比,CMS GC 就会被触发。
默认情况下,如果没有指定 -XX:+UseCMSInitiatingOccupancyOnly,JVM 可能会基于运行时收集到的性能数据动态调整这个阈值,以优化垃圾回收的时机。但是,当 -XX:+UseCMSInitiatingOccupancyOnly 被设置后,JVM 将不再动态调整阈值,而是严格遵守 -XX:CMSInitiatingOccupancyFraction 的设定值。
例如,如果你设置了 -XX:CMSInitiatingOccupancyFraction=75 和 -XX:+UseCMSInitiatingOccupancyOnly,那么当老年代的使用率达到75%时,CMS GC 将被强制启动,无论当前应用的实际负载如何。
通常,这种设置是在对应用程序的内存使用模式有深入了解的情况下才会使用,以确保垃圾回收发生在最合适的时间点,避免过早或过晚的垃圾回收导致的性能问题。然而,由于现代JVM版本已经弃用了CMS回收器并推荐使用G1或其他更先进的回收器,这个选>项可能在某些JVM版本中不再适用或需要不同的替代方案。

-XX:CMSInitiatingOccupancyFraction

配合-XX:+UseCMSInitiatingOccupancyOnly参数来使用

-XX:+CMSParallelRemarkEnabled

-XX:+CMSParallelRemarkEnabled 是一个与Java虚拟机(JVM)的垃圾回收策略相关的命令行选项,特别针对使用了Concurrent Mark Sweep (CMS)垃圾回收器的环境。此选项用于控制在CMS回收过程中“remark”阶段的并行度。
在CMS垃圾回收器中,“remark”阶段是一个重要的步骤,其主要任务是对存活的对象进行重新标记,以确保在垃圾回收过程中没有遗漏可回收的对象。默认情况下,这个阶段是单线程执行的,这意味着它可能会成为性能瓶颈,尤其是在多核处理器的现代硬件上。
当使用 -XX:+CMSParallelRemarkEnabled 选项时,JVM 将在 “remark” 阶段启用并行处理。这意味着它将利用多个CPU核心同时进行对象的重新标记,从而显著加快这一阶段的速度,减少GC停顿时间,提高应用程序的整体响应性。这对于需要低延迟和高吞吐量的应用场景尤其重要。
然而,值得注意的是,虽然并行remark阶段可以减少GC停顿时间,但它也可能消耗更多的CPU资源,这在CPU资源紧张的环境中可能会影响应用程序的其他部分。因此,是否启用并行remark阶段应该基于具体的应用场景和系统资源情况来决定,可能需要通过性能测试和调优来找到最佳的配置。
此外,随着Java版本的演进,CMS垃圾回收器在某些新版本的JVM中已被弃用或默认不作为首选回收器,取而代之的是G1垃圾回收器等更先进的技术。因此,在使用 -XX:+CMSParallelRemarkEnabled 等与CMS相关的参数时,应确保它们适用于你正在使用的JVM版本。

-XX:+CMSClassUnloadingEnabled

-XX:+CMSClassUnloadingEnabled 是一个与Java虚拟机(JVM)的垃圾回收机制相关的命令行选项,尤其与使用Concurrent Mark Sweep (CMS)垃圾回收器有关。这个选项控制着类卸载的行为,即在CMS回收过程中是否允许卸载不再使用的类。
在Java中,类加载和卸载是类生命周期管理的重要组成部分。类卸载是指当一个类不再被引用并且满足特定条件时,JVM可以从内存中移除该类的过程。这有助于释放不再使用的类所占用的内存,特别是在长时间运行的应用程序中,可以有效防止内存泄漏和提高内存使用效率。
当 -XX:+CMSClassUnloadingEnabled 被启用时,意味着CMS垃圾回收器在执行回收过程时,会尝试卸载那些不再被引用的类。这通常发生在类加载器本身已经成为垃圾(即没有强引用指向它)的情况下。类卸载可以回收由类元数据和常量池等组成的永久代(在Java 8及以前的版本中)或元空间(从Java 9开始)中的空间。
然而,类卸载并不是一个简单的过程,它涉及到复杂的依赖关系检查,以确保不会意外地卸载仍然被应用程序需要的类。因此,尽管类卸载可以带来内存回收的好处,但在某些情况下,它也可能引入额外的性能开销,特别是当类的数量非常大时。此外,类卸载还可能导致应用程序的某些部分需要重新加载类,这可能会影响应用程序的性能和稳定性。
总之,-XX:+CMSClassUnloadingEnabled 允许CMS垃圾回收器在适当的条件下进行类卸载,但是否启用它取决于具体的应用场景和对内存管理的需求。在启用类卸载之前,建议充分评估其对应用程序性能和稳定性的潜在影响。

-XX:+ScavengeBeforeFullGC

-XX:+ScavengeBeforeFullGC 是一个 Java 虚拟机(JVM)的垃圾回收(Garbage Collection, GC)相关参数,主要用于控制在执行 Full GC(即整个堆空间的垃圾回收,包括年轻代和老年代)之前是否先进行一次年轻代的垃圾回收(也称为 Minor GC 或 Scavenge GC)。
当 JVM 需要执行 Full GC 时,如果启用了 -XX:+ScavengeBeforeFullGC 参数,它会在 Full GC 开始前先尝试进行一次年轻代的垃圾回收。这样做的主要目的是尽可能减少 Full GC 的工作量,因为年轻代的垃圾回收通常比 Full GC 快得多,且对系统的影响较小。通过先清理年轻代,可以将一些不再使用的对象从年轻代移除,从而减少 Full GC 需要处理的对象数量,这有助于提高整体的 GC 效率和应用程序的响应时间。
然而,这个参数并非在所有情况下都是有益的。如果年轻代的垃圾回收频率很高或者回收成本较高,频繁地在 Full GC 前进行年轻代回收可能会增加不必要的开销,反而影响应用程序的性能。因此,是否启用 -XX:+ScavengeBeforeFullGC 应该根据具体的应用程序特性和运行时的 GC 行为来决定,通常需要通过监控和测试来确定最佳的配置。
需要注意的是,随着 Java 版本的更新,JVM 默认的垃圾回收器和相关参数的默认行为可能会有所变化。在较新的 Java 版本中,如使用 G1 垃圾回收器时,这个参数可能不再适用或具有不同的效果。因此,在使用任何 GC 相关参数时,都应该参考当前 Java 版本的官方文档。

-XX:SoftRefLRUPolicyMSPerMB

-XX:SoftRefLRUPolicyMSPerMB 是一个与Java虚拟机(JVM)软引用(Soft Reference)和垃圾回收策略相关的命令行参数。它主要用于控制软引用对象的回收策略,尤其是当JVM的堆空间开始变得紧张时,如何决定软引用对象的回收时机。
在Java中,软引用是一种弱化版本的对象引用,它允许对象在内存压力下被垃圾回收器回收,而不是等到内存耗尽时才进行回收。软引用通常用于实现缓存机制,其中缓存项可以在内存不足时被自动清理,而不会导致程序因内存溢出而崩溃。
-XX:SoftRefLRUPolicyMSPerMB 参数允许开发者指定在内存压力下,每兆字节(MB)堆空间中软引用对象可以存活的毫秒数(ms)。这是一个时间窗口的概念,表示在内存紧张的情况下,JVM在尝试回收软引用对象前等待的时间长度。具体来说,这个参数决定了在堆空间使用达到一定阈值后,软引用对象在被回收前可以保持活动状态的时间。
例如,如果设置 -XX:SoftRefLRUPolicyMSPerMB=100,那么每兆字节的堆空间中,软引用对象在内存压力下可以存活大约100毫秒。这意味着,如果堆空间为100MB,则所有软引用对象在内存压力下可以存活大约100 * 100 = 10000毫秒,即10秒左右。
通过调整这个参数,开发者可以控制软引用对象的生存周期,以适应不同应用场景下的内存管理和缓存需求。较低的值会导致软引用对象更快地被回收,适合于内存敏感型应用;而较高的值则允许软引用对象在内存压力下存活更长时间,适用于需要较大缓存容量的场景。
然而,值得注意的是,这个参数的设置需要谨慎,因为它直接影响到软引用对象的生命周期,进而影响到内存的使用效率和应用程序的性能。在实际应用中,可能需要结合具体的业务逻辑和运行时的监控数据来确定最合适的值。

-XX:+ReduceInitialCardMarks

-XX:+ReduceInitialCardMarks 是一个与Java虚拟机(JVM)的垃圾回收(GC)策略相关的命令行选项,特别针对使用了Shenandoah或ZGC等现代垃圾回收器的环境。此选项旨在优化卡表(card table)的初始化过程,以减少GC暂停时间和提高GC效率。
在JVM中,卡表(card table)是一种用于快速检测哪些内存区域可能包含跨代引用的数据结构。在进行垃圾回收时,卡表可以帮助GC算法快速定位到可能需要扫描的对象,从而避免全堆扫描,提高GC效率。然而,卡表的初始化和维护也会带来一定的开销,尤其是在大规模堆中。
当启用 -XX:+ReduceInitialCardMarks 选项时,JVM在启动时会采取一种更为高效的方式来初始化卡表,具体来说,它会尽量减少初始标记的范围,只标记那些确实存在跨代引用的区域。这样做的好处是减少了初始GC的暂停时间,因为不需要对整个堆进行标记,而是只标记那些可能存在引用的区域。
在Shenandoah和ZGC这样的低暂停时间GC中,减少初始卡标记的操作对于进一步降低GC暂停时间尤为重要,因为这些GC器设计的目标之一就是最小化应用程序的暂停时间,以支持对延迟敏感的应用场景。
然而,值得注意的是,-XX:+ReduceInitialCardMarks 的效果和适用性取决于具体的JVM版本和所使用的GC器类型。在某些情况下,如果堆中的跨代引用分布较为均匀,减少初始卡标记可能不会带来显著的性能提升,甚至在某些极端情况下可能会因为额外的检查而略微增加GC的总体开销。因此,是否启用这个选项应该基于具体的应用场景和性能测试结果来决定。
总之,-XX:+ReduceInitialCardMarks 是一个用于优化现代GC器中卡表初始化过程的JVM参数,旨在减少GC暂停时间,提高GC效率,尤其适用于对延迟敏感的应用场景。

标签:回收,XX,参数,垃圾,JVM,GC,解析,CMS
From: https://www.cnblogs.com/BitX/p/18299236

相关文章

  • 动态添加HTML时onclick函数参数传递
    onclick函数动态传参1.参数为数值类型时:var tmp=123;var strHTML="<divonclick=func(" +tmp+")>点击弹出数据及其类型</div>";info.append(strHTML); function func(tmp){    alert(typeof tmp+"" +tmp);}string12......
  • 计算机网络 ARP协议(地址解析协议)
            ARP(AddressResolutionProtocol)是一种用于解析网络层地址(如IPv4地址)和数据链路层地址(如MAC地址)之间对应关系的协议。它主要用于在局域网(LAN)中根据目标设备的IP地址获取其对应的MAC地址,以便在数据链路层进行准确的数据传输。ARP协议工作原理:ARP请求和响应......
  • 计算机网络 DNS协议---域名解析
    域名解析是计算机网络中的重要过程,它指的是将人类可读的域名(例如www.example.com)转换为计算机可理解的IP地址(例如192.0.2.1)的过程。这个过程依赖于域名系统(DNS)协议的支持。 DNS协议基本概念DNS(DomainNameSystem)是互联网中用于将域名解析为IP地址的分布式命名系统。它......
  • Avast! Web Shield核心防护:‘aswjsflt.dll’解析与丢失修复全案
    aswjsflt.dll是一个动态链接库(DLL)文件,与Avast!Antivirus软件相关。这个文件是Avast!WebShield的一个组件,负责在浏览器中监控JavaScript代码,防止恶意脚本的执行。aswjsflt.dll作为浏览器的扩展或插件工作,帮助实时保护用户的在线活动免受潜在的网络威胁。当系统提示aswjsflt......
  • Windows系统账户管理核心:‘samsrv.dll’解析与丢失修复全方案
    samsrv.dll是Windows操作系统中的一个重要动态链接库(DLL)文件,它与SAM(SecurityAccountsManager)服务密切相关,负责处理本地和网络账户的管理,包括用户登录、权限验证和密码更改等操作。samsrv.dll文件在Windows系统中扮演着关键角色,尤其是在网络环境下,它帮助处理与网络账户相关的......
  • Visual Studio 2013俄语环境基石:‘mfc120rus.dll’解析与丢失修复全案
    mfc120rus.dll是一个动态链接库(DLL)文件,与MicrosoftFoundationClasses(MFC)相关。MFC是一个广泛使用的C++类库,用于简化Windows应用程序的开发。mfc120rus.dll特别地,是MFC库的俄语版本,用于支持俄语字符集和语言环境,它是MFC12.0版本的一部分,常用于VisualStudio2013中编译的......
  • [JVM]垃圾回收
    垃圾回收机制标记+清除先标记哪些内存没有被引用,然后释放这些内存注意,释放不代表要重写这些内存里的数据,只需要把这段内存的起始和结束的地址记录下来即可。速度很快,但是很容易产生内存碎片标记+整理先标记哪些内存没有被引用,然后释放这些内存,注意,释放内存之后要进行紧凑操......
  • [JVM]类加载
    类加载加载java数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预先定义,引用数据类型才需要类的加载过程。类的加载,就是将java类的字节码文件加载到内存中,并通过字节码在内存中构建出类的原型---类模板对象。jvm把字节码中的常量池,类字段,类方法等信息存储到类模......
  • c++参数包展开和折叠表达式
    template<typenameT>voidfun2(Tt){cout<<t<<endl;}//利用逗号表达式和初始化列表展开template<typename...Arg6>voidfun1(Arg6...args){intarr[]={(fun2(args),0)...};}template<typenameT>intfunc3Imp(T&&t......
  • vue3前端项目结构解析(2024-07-12)
    .├──build#打包脚本相关│  ├──config#配置文件│  ├──generate#生成器│  ├──script#脚本│  └──vite#vite配置├──mock#mock文件夹├──public#公共静态资源目录├──src#主目录│  ├──api#接口......