建站之星怎么使用,宁波企业建站程序,如何在局域网上做网站,做期货新闻比较好的网站文章目录 Pre1. 引言#xff1a;Java版本演进与GC演变背景2. 查看JVM参数默认值的方法3. 基于ElasticSearch的JVM参数示例分析3.1 堆空间配置与AlwaysPreTouch3.2 堆外内存细分3.3 GC日志配置#xff08;Java 8 vs Java 9#xff09;3.4 OOM时Dump配置3.5 垃圾回收器配置Java版本演进与GC演变背景2. 查看JVM参数默认值的方法3. 基于ElasticSearch的JVM参数示例分析3.1 堆空间配置与AlwaysPreTouch3.2 堆外内存细分3.3 GC日志配置Java 8 vs Java 93.4 OOM时Dump配置3.5 垃圾回收器配置CMS示例及迁移3.6 其他额外参数 4. 常见GC器演进与配置要点4.1 CMS生命周期与参数4.2 G1配置要点4.3 ZGC、Shenandoah简介4.4 其他GCSerial、Parallel等 5. 深入调优分代比例、SurvivorRatio、TenuringThreshold等6. 小结与建议 Pre
性能优化 - 理论篇常见指标及切入点
性能优化 - 理论篇性能优化的七类技术手段
性能优化 - 理论篇CPU、内存、I/O诊断手段
性能优化 - 工具篇常用的性能测试工具
性能优化 - 工具篇基准测试 JMH
性能优化 - 案例篇缓冲区
性能优化 - 案例篇缓存
性能优化 - 案例篇数据一致性
性能优化 - 案例篇池化对象_Commons Pool 2.0通用对象池框架
性能优化 - 案例篇大对象的优化
性能优化 - 案例篇使用设计模式优化性能
性能优化 - 案例篇并行计算
性能优化 - 案例篇多线程锁的优化
性能优化 - 案例篇CAS、乐观锁、分布式锁和无锁
性能优化 - 案例篇 详解 BIO NIO AIO
性能优化 - 案例篇 19 条常见的 Java 代码优化法则
性能优化 - 案例篇JVM垃圾回收器
性能优化 - 案例篇JIT
性能优化 - 案例篇11种优化接口性能的通用方案 1. 引言Java版本演进与GC演变背景
Java 8长期以来是企业主力版本很多公司因稳定性和兼容性选择Java 8并启用CMS垃圾回收器。但从Java 9开始进入半年一版的快速发布模式Java 8与Java 11成为LTS版本后续LTS如Java 17、Java 21等陆续推出([en.wikipedia.org][1], [preemptive.com][2])。
随着JVM内部不断演进CMS在Java 9中被标记为Deprecated并于Java 14正式移除见JEP 363([openjdk.org][3], [oracle.com][4])。新GC器如G1、ZGC、Shenandoah成熟逐渐成为主流选择。 因此在不同JVM版本上配置GC参数需先查看默认值不要盲从他人建议。 2. 查看JVM参数默认值的方法
可以使用以下命令查看参数的默认值和当前生效参数
java -XX:PrintFlagsFinal -XX:UseG1GC 21 | grep UseAdaptiveSizePolicy上述命令在启动时列出所有Flags的最终值通过grep过滤目标参数。常见用法还有
java -XX:PrintCommandLineFlags -version输出示例Java 8默认Parallel GC
-XX:InitialHeapSize127905216 -XX:MaxHeapSize2046483456 -XX:PrintCommandLineFlags -XX:UseCompressedClassPointers -XX:UseCompressedOops -XX:UseParallelGC
openjdk version 1.8.0_41
...通过这些命令可确认某个参数是否已有默认值避免重复配置或无效配置。
3. 基于ElasticSearch的JVM参数示例分析
ElasticSearchES作为典型Java应用其jvm.options提供了常见配置案例便于学习和参考。
3.1 堆空间配置与AlwaysPreTouch
ES常见配置
-Xms1g
-Xmx1g
-XX:AlwaysPreTouch将-Xms与-Xmx设为相同值可避免动态扩容开销。在堆较大时-XX:AlwaysPreTouch会在JVM启动时触碰touch所有堆页面提前向操作系统申请并锁定内存页增加启动时间但减少运行时动态分配时的性能损耗提高稳定性和吞吐([docs.oracle.com][5])。
对于存储型服务如ES通常将堆设置为物理内存一半以留一半给操作系统文件缓存PageCache提高I/O效率对于计算型Web服务可将堆设置为物理内存2/3剩余1/3供直接内存、本地内存等使用。 JVM内存布局堆与堆外细分、PageCache与JVM堆的关系。 堆外包含元空间、CodeCache、直接内存、本地内存线程栈、网络缓冲等及JNI分配等。
3.2 堆外内存细分
元空间Metaspace通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize可指定初始化与上限默认无上限可能导致过度使用系统内存建议根据应用类加载行为适当设置上限。JIT编译后代码存放 CodeCacheJIT编译后代码存储区通过-XX:ReservedCodeCacheSize设置上限若CodeCache满会触发Full GC或影响性能。直接内存Direct MemoryByteBuffer等直接缓冲区申请内存通过-XX:MaxDirectMemorySize限制防止内存占用过大。本地内存Native Memory线程栈、JNI malloc、网络连接缓冲等无法由JVM直接控制但需关注高并发场景下的本地内存消耗。JNI内存依赖具体JNI实现JVM无法控制但应避免JNI库出现内存泄漏。
3.3 GC日志配置Java 8 vs Java 9
在Java 8中常用GC日志参数以ES为例
-XX:PrintGCDetails
-XX:PrintGCDateStamps
-XX:PrintTenuringDistribution
-XX:PrintGCApplicationStoppedTime
-XX:-Xloggc:logs/gc.log
-XX:UseGCLogFileRotation
-XX:NumberOfGCLogFiles32
-XX:GCLogFileSize64m这些参数可打印GC细节、时间戳(系统时间)、年龄分布、STW停顿时间并配置日志滚动([docs.oracle.com][5])。
Java 9移除40多个GC日志参数采用Unified Logging
-Xlog:gc*,gcagetrace,safepoint:filelogs/gc.log:utctime,pid,tags:filecount32,filesize64m此方式更统一、灵活可通过jcmd动态调整([foojay.io][6])。
3.4 OOM时Dump配置
ES常见
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPathdata
-XX:ErrorFilelogs/hs_err_pid%p.log发生OOM时自动生成堆转储文件用于后续MAT等工具分析问题根因。正常可使用jmap等命令获取堆快照但生产环境优先配置自动Dump。
3.5 垃圾回收器配置CMS示例及迁移
ES默认曾使用CMS
-XX:UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction75
-XX:UseCMSInitiatingOccupancyOnlyUseConcMarkSweepGC表示Young代用ParNewOld代用CMS。CMSInitiatingOccupancyFraction设定启动并发标记的老年代占用阈值避免Concurrent Mode Failure需配合UseCMSInitiatingOccupancyOnly生效。
另外对于 CMS 垃圾回收器常用的还有下面的配置参数
-XX:ExplicitGCInvokesConcurrent
-XX:CMSFullGCsBeforeCompaction0
-XX:CMSScavengeBeforeRemark
-XX:ParallelRefProcEnabled-XX:ExplicitGCInvokesConcurrent 当代码里显示的调用了 System.gc()实际上是想让回收器进行FullGC如果发生这种情况则使用这个参数开始并行 FullGC。建议加上。 -XX:CMSFullGCsBeforeCompaction 默认为 0就是每次FullGC都对老年代进行碎片整理压缩建议保持默认。 -XX:CMSScavengeBeforeRemark 开启或关闭在 CMS 重新标记阶段之前的清除YGC尝试。可以降低 remark 时间建议加上。 -XX:ParallelRefProcEnabled 可以用来并行处理 Reference以加快处理速度缩短耗时。
但CMS在Java 14已移除不可再用应转向G1或更现代GC([blog.gceasy.io][7])。
3.6 其他额外参数
-Xss1m设置线程栈大小为1MB默认即1MB可根据线程数和调用深度适当调整。-XX:-OmitStackTraceInFastThrowES关闭此项以便调试异常开启可合并重复异常栈以提高性能但调试困难。-Djava.awt.headlesstrue服务器无GUI时需设置Headless模式避免AWT初始化失败。其他-D参数如-Dfile.encodingUTF-8、-Des.networkaddress.cache.ttl60等根据应用需求配置网络、编码、临时目录、日志框架等。 4. 常见GC器演进与配置要点
4.1 CMS生命周期与参数
CMS自Java 1.4.1起被引入目标低延迟但不压缩老年代容易产生碎片、发生Concurrent Mode Failure导致长STW。Java 9开始DeprecatedJava 14移除JEP 363([openjdk.org][3], [oracle.com][4])。建议迁移至G1等。
4.2 G1配置要点
G1自Java 7u14实验性引入Java 9起默认GC。优点并发标记、分区回收、自动压缩提供MaxGCPauseMillis目标设置。常见参数
-XX:UseG1GC-XX:MaxGCPauseMillis期望毫秒-XX:G1HeapRegionSize2的幂默认通常合适不建议轻易修改-XX:InitiatingHeapOccupancyPercent启动并发标记阈值默认45%-XX:ConcGCThreads默认即可 G1无需手动设置-Xmn自动调优分代大小可通过打印日志分析GC行为调整Pause目标和Region大小。 4.3 ZGC、Shenandoah简介
ZGCJava 11实验性Java 15生产就绪面向超大堆和低停顿通常10ms。使用-XX:UseZGC启用需JDK对应版本支持。Shenandoah类似目标Java 12实验Java 15成熟。 这些GC适用于大内存、低延迟场景但需确认应用和平台支持。 4.4 其他GCSerial、Parallel等
Serial GC-XX:UseSerialGC小堆、单线程场景。Parallel GC-XX:UseParallelGC / UseParallelOldGC追求吞吐适合批处理。 选择需根据应用类型交互型、批处理、超大堆等决定。 5. 深入调优分代比例、SurvivorRatio、TenuringThreshold等
-Xmn调整年轻代大小G1一般无需在Parallel或CMS可根据业务调整若对象存活率低可加大年轻代。-XX:SurvivorRatioEden和Survivor区比例默认8可根据对象晋升行为调整。-XX:MaxTenuringThreshold对象晋升阈值CMS下默认6G1下默认15可通过-XX:PrintTenuringDistribution观察年龄分布若早期代晋升过多适当降低阈值若大多数对象在Survivor区很快死亡适当增大可减少晋升压力。PretenureSizeThreshold大对象直接分配到老年代使用少见。 通过GC日志分析或可视化工具如GCViewer、GCEasy观察GC停顿、年轻代/老年代使用情况再针对性调整。
6. 小结与建议
在不同JVM版本和GC器上先查看默认参数不要盲信旧配置根据应用类型存储、计算、低延迟、高吞吐选择合适堆大小及GC器通过-XX:PrintCommandLineFlags、PrintFlagsFinal、-Xlog或旧日志参数查看生效配置合理配置元空间、CodeCache、直接内存等防止本地内存耗尽配置GC日志和OOM自动Dump便于问题排查CMS已废弃迁移至G1或更现代GC深入调优需结合GC日志分析工具进行调整分代比例、停顿目标、并发线程数等在生产环境中小幅、渐进式调整观察效果。
[1]: https://en.wikipedia.org/wiki/Java_version_history?utm_sourcechatgpt.com Java version history
[2]: https://www.preemptive.com/blog/the-road-to-java-9/?utm_sourcechatgpt.com The Road to Java 9 - PreEmptive Solutions
[3]: https://openjdk.org/jeps/363?utm_sourcechatgpt.com JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage ...
[4]: https://www.oracle.com/java/technologies/javase/14-relnote-issues.html?utm_sourcechatgpt.com JDK 14 Release Notes - java - Oracle
[5]: https://docs.oracle.com/en/java/java-components/enterprise-performance-pack/epp-user-guide/printing-jvm-information.html?utm_sourcechatgpt.com 3 Printing JVM Information - Java - Oracle Help Center
[6]: https://foojay.io/today/introduction-to-jvm-unified-logging-jep-158-jep-271/?utm_sourcechatgpt.com Introduction to JVM Unified Logging (JEP-158 / JEP-271) - Foojay.io
[7]: https://blog.gceasy.io/cms-gc-algorithm-removed-from-java-14/?utm_sourcechatgpt.com CMS GC algorithm removed from Java 14?