暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

jvm优化分析及示例

IT那活儿 2024-04-28
252
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!    

当前默认jvm参数

#jinfo -flags 1

Non-default VM flags: -XX:CICompilerCount=3 -
XX:InitialHeapSize=260046848 -XX:MaxHeapSize=4129292288 -
XX:MaxNewSize=1376256000 -XX:MinHeapDeltaBytes=524288 -
XX:NewSize=86507520 -XX:OldSize=173539328 -
XX:+UseCompressedClassPointers -XX:+UseCompressedOops -
XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC

  • -XX:CICompilerCount=3

    设置并行编译的线程数为3。这可以提高编译速度,特别是在多核处理器上。

  • -XX:InitialHeapSize=260046848

    设置初始堆内存大小为256MB。这是Java虚拟机启动时分配给堆内存的最小空间。

  • -XX:MaxHeapSize=4129292288

    设置最大堆内存大小为4GB。这是Java虚拟机允许分配的最大堆内存空间。

  • -XX:MaxNewSize=1376256000

    设置新生成对象的最大尺寸为1.3GB。当新生成的对象超过这个尺寸时,会触发垃圾回收。

  • -XX:MinHeapDeltaBytes=524288

    设置堆内存增量为512KB。这是在堆内存增长时,每次增加的最小值。

  • -XX:NewSize=86507520

    设置新生成对象的初始尺寸为8MB。这是新生成对象在第一次分配内存时的初始尺寸。

  • -XX:OldSize=173539328

    设置老年代的初始尺寸为16MB。这是老年代在第一次分配内存时的初始尺寸。

  • -XX:+UseCompressedClassPointers

    启用压缩类指针。这可以减少类指针的大小,从而减少内存使用和提高性能。

  • -XX:+UseCompressedOops

    启用压缩对象指针。这可以减少对象指针的大小,从而减少内存使用和提高性能。

  • -XX:+UseFastUnorderedTimeStamps

    启用快速无序时间戳。这可以提高时间戳的访问速度,从而提高性能。

  • -XX:+UseParallelGC

    启用并行垃圾回收。这可以在多核处理器上提高垃圾回收的效率。

当前堆内存使用率

pod当前性能监控

当前pod资源限制:2C 4G HDD30G。


堆内存分析

元数据空间大小未限制,有大对象oom风险堆内存未指定最大内存限制,64位的JVM上,物理内存小于192MB时,为物理内存的一半;物理内存大192MB且小于128GB时,为物理内存的四分之一;大于等于128GB时,都为32GB;jvm默认采用物理内的4分之一,当前最大堆内存3.9GB。

年轻代和老年代空间利用率不足,对于频繁gc的年轻带比例可以适当下调,内存比例建议修改为1:2,新生代中 Eden 区与 Survivor 区的空间比也适当调整,可以增加年轻代空间的利用率,垃圾回收器指定CMS,并设置触发比例,提高整体空间的利用率。

当前年轻代和老年代整体的use使用大小合计250M,设置初始的堆内存为256M,最大为512M较为合理,同时指定服务的gc日志和oom日志转储,可以针对服务故障时提供相应的分析日志,也可以从gc日志上反应服务的整体健康状态。

添加指定jvm参数

-Xms256m -Xmx512m -XX:NewRatio=2 -XX:MetaspaceSize=20m -
XX:MaxMetaspaceSize=128m -Xss256k -
XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/fr-thirdService/logs/oomcxk-%t.hprof -XX:+PrintGC -XX:+PrintGCDateStamps
-XX:+PrintGCDetails -Xloggc:/var/fr-thirdService/logs/gccxk.log -XX:SurvivorRatio=8 -
XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75 
-XX:+UseCMSInitiatingOccupancyOnly

  • -Xms256m

    设置 JVM 启动时分配的堆内存大小为 256MB。

  • -Xmx512m

    设置 JVM 可以使用的最大堆内存大小为 512MB。

  • -XX:NewRatio=2

    这个参数设置了老年代与新生代的比例。在这里,老年代与新生代的大小比为 2:1。

  • -XX:MetaspaceSize=20m

    设置元空间的最小大小为 20MB。元空间用于存储类的元数据,这个值表示元空间的最小大小。

  • -XX:MaxMetaspaceSize=128m

    设置元空间的最大大小为 128MB。

  • -Xss256k

    设置线程栈大小为 256KB。

  • -XX:+HeapDumpOnOutOfMemoryError

    当 JVM 发生内存溢出错误时,将堆转储到文件。

  • -XX:HeapDumpPath=/var/ids/logs/oomcxk.hprof 

    指定堆转储文件的存储路径和文件名格式。

  • -XX:+PrintGC

    打印垃圾收集的详细信息。

  • -XX:+PrintGCDateStamps

    在垃圾收集日志中添加时间戳。

  • -XX:+PrintGCDetails

    打印垃圾收集的详细信息,包括各个代的大小和回收的内存量等。

  • -Xloggc:/var/ids/logs/gccxk.log

    指定垃圾收集日志的存储路径和文件名。

  • -XX:SurvivorRatio=8

    新生代中 Eden 区与 Survivor 区的空间比为 8:1。

  • -XX:+UseConcMarkSweepGC

    使用 CMS 垃圾收集器。

  • -XX:CMSInitiatingOccupancyFraction=75

    初始化 CMS 垃圾收集器的触发比例,这个值表示老年代使用的空间占整个堆空间的 75%。

  • -XX:+UseCMSInitiatingOccupancyOnly

    只使用 CMSInitiatingOccupancyFraction 来确定 CMS 垃圾收集器的触发时机,忽略其他触发条件。

优化后堆内存情况

优化后pod性能使用率
64位的JVM上,物理内存小于192MB时,为物理内存的一半;物理内存大192MB且小于128GB时,为物理内存的四分之一;大于等于128GB时,都为32GB。


END


本文作者:段玉贇(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论