• 记一次JVM参数调优经历


    1.背景

    定时任务每秒向客户端推送10w全量数据,预计最大有30M
    两个用户系统勉强能用,六个+ 几分钟后系统不可用
    频发full gc 导致系统不可用。

    2.最终方案

    3.常见参数介绍

    3.1 jps

    jps查看所有java进程编号 相当与 ps -ef|grep java

    命令格式:jps [options ] [ hostid ]

       [options]选项 :
    

    -q:仅输出VM标识符,不包括classname,jar name,arguments in main method
    -m:输出main method的参数
    -l:输出完全的包名,应用主类名,jar的完全路径名
    -v:输出jvm参数
    -V:输出通过flag文件传递到JVM中的参数
    在这里插入图片描述

    3.2 jmap

    语法:jmap [option] pid
    在这里插入图片描述

    3.2.1 jmap 看堆内存使用情况

    jmap -heap 119251 堆内存的使用情况
    在这里插入图片描述

    3.2.2 jmap 导出堆快照

    -dump 有个选择只选择存活的对象

    jmap -dump:live,format=b,file=dump2.dump(文件名) 进程pid
    在这里插入图片描述

    –histo查看存活对象/最大的前n个对象

    jmap –histo:live pid
    在这里插入图片描述
    jmap –histo:live 112386|head -10
    jmap –histo:live 112686
    备注:要获得某个对象的大小,可以将其总大小除以该对象类型的数量。如果指定了live参数,则只计算活动的对象

    jstat

    jstat –option pid 刷新时间单位毫秒
    jstat -gccause 119251 15000
    jstack 1111 >1.tet 输出线程信息到文件1.tet中

    jinfo

    语法:
    jinfo [ option ] pid 连接到正在运行的进程
    jinfo [ option ] executable core 连接到核心文件
    jinfo [ option ] [ servier-id ] remote-hostname-or-IP 要连接到远程DEBUG服务器

    jinfo pid 查看所有配置

    [root@localhost ~]# jinfo 394394
    Attaching to process ID 394394, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.231-b11
    Java System Properties:
    
    java.runtime.name = Java(TM) SE Runtime Environment
    java.vm.version = 25.231-b11
    sun.boot.library.path = /usr/java/jdk1.8.0_231-amd64/jre/lib/amd64
    java.protocol.handler.pkgs = org.springframework.boot.loader
    java.vendor.url = http://java.oracle.com/
    java.vm.vendor = Oracle Corporation
    path.separator = :
    file.encoding.pkg = sun.io
    java.vm.name = Java HotSpot(TM) 64-Bit Server VM
    sun.os.patch.level = unknown
    sun.java.launcher = SUN_STANDARD
    user.country = US
    user.dir = /home/labsystem
    java.vm.specification.name = Java Virtual Machine Specification
    PID = 394394
    java.runtime.version = 1.8.0_231-b11
    java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
    os.arch = amd64
    java.endorsed.dirs = /usr/java/jdk1.8.0_231-amd64/jre/lib/endorsed
    line.separator = 
    
    java.io.tmpdir = /tmp
    java.vm.specification.vendor = Oracle Corporation
    os.name = Linux
    sun.jnu.encoding = UTF-8
    java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
    spring.beaninfo.ignore = true
    sun.nio.ch.bugLevel = 
    java.specification.name = Java Platform API Specification
    java.class.version = 52.0
    sun.management.compiler = HotSpot 64-Bit Tiered Compilers
    os.version = 3.10.0-693.el7.x86_64
    user.home = /root
    user.timezone = Asia/Shanghai
    catalina.useNaming = false
    java.awt.printerjob = sun.print.PSPrinterJob
    file.encoding = UTF-8
    java.specification.version = 1.8
    catalina.home = /tmp/tomcat.3149827499108446965.8285
    user.name = root
    java.class.path = push_test.jar
    java.vm.specification.version = 1.8
    sun.arch.data.model = 64
    sun.java.command = push_test.jar --spring.profiles.active=pre
    java.home = /usr/java/jdk1.8.0_231-amd64/jre
    user.language = en
    java.specification.vendor = Oracle Corporation
    awt.toolkit = sun.awt.X11.XToolkit
    java.vm.info = mixed mode
    java.version = 1.8.0_231
    java.ext.dirs = /usr/java/jdk1.8.0_231-amd64/jre/lib/ext:/usr/java/packages/lib/ext
    sun.boot.class.path = /usr/java/jdk1.8.0_231-amd64/jre/lib/resources.jar:/usr/java/jdk1.8.0_231-amd64/jre/lib/rt.jar:/usr/java/jdk1.8.0_231-amd64/jre/lib/sunrs
    asign.jar:/usr/java/jdk1.8.0_231-amd64/jre/lib/jsse.jar:/usr/java/jdk1.8.0_231-amd64/jre/lib/jce.jar:/usr/java/jdk1.8.0_231-amd64/jre/lib/charsets.jar:/usr/java/jdk1.8.0_231-amd64/jre/lib/jfr.jar:/usr/java/jdk1.8.0_231-amd64/jre/classesjava.awt.headless = true
    java.vendor = Oracle Corporation
    catalina.base = /tmp/tomcat.3149827499108446965.8285
    file.separator = /
    java.vendor.url.bug = http://bugreport.sun.com/bugreport/
    sun.io.unicode.encoding = UnicodeLittle
    sun.cpu.endian = little
    sun.cpu.isalist = 
    
    VM Flags:
    Non-default VM flags: -XX:CICompilerCount=18 -XX:InitialHeapSize=3221225472 -XX:MaxHeapSize=3221225472 -XX:MaxNewSize=2147483648 -XX:MinHeapDeltaBytes=524288 -
    XX:NewSize=2147483648 -XX:OldSize=1073741824 -XX:PretenureSizeThreshold=0 -XX:TargetSurvivorRatio=80 -XX:ThreadStackSize=512 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC Command line:  -Xmn2048m -Xmx3072m -Xms3072m -Xss512k -XX:TargetSurvivorRatio=80 -XX:PretenureSizeThreshold=0 -Xdebug -agentlib:jdwp=transport=dt_socket,server
    =y,suspend=n,address=9997
    
    查看jvm的指定参数配置

    jinfo -flag 参数名称 pid

    jinfo -flag SurvivorRatio 6805
    在这里插入图片描述

    查看大对象直接进入老年代内存的大小 0 默认所有对象都会在eden区创建
    jinfo -flag PretenureSizeThreshold pid
    在这里插入图片描述

    增加jvm启动参数

    jinfo -flag +参数名称 pid
    通过命令 jinfo -flag +PrintGC 108934,启用了PrintGC,GC后,便会输出GC日志。

    jvm启动参数失效

    jinfo -flag -参数名称 pid
    通过命令 jinfo -flag -PrintGC 108934,启用了PrintGC,GC后,便会停止输出GC日志。

    jvm 参数修改值

    jinfo -flag name=value pid
    并不是所有的参数都可以通过本命令设置,如MaxNewSize参数就不可以通过本命令设置。

    看jvm收集器

    java -XX:+PrintCommandLineFlags –version

    MaxTenuringThreshold 最大年龄

    补充 jdk8 默认策略

    内存分配

    Java8 可自使用调节edue区和suviro区的比例。-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=3 必须显示声明下图是为做声明的两次
    在这里插入图片描述

    最大对象定义

    PretenureSizeThreshold 设置对象直接进入年老代的门槛,默认0 意味着所有对象都会在现在新生代分配内存。
    在这里插入图片描述

    linux 命令

    free info看linux内存情况
    在这里插入图片描述
    lscpu 看linxu的cpu信息

    在这里插入图片描述
    在这里插入图片描述

    du –sh 看当前文件夹大小

    du –h 看当前文件下所有目录文件的大小(明细版)

  • 相关阅读:
    两个指数函数乘积的定积分
    力扣刷题19-删除链表的倒数第N个节点
    Ubuntu 22.04安装Rust编译环境并且测试
    linux KVM的网络设置方法(bridge和nat)
    数据中台模块介绍
    Ops实践 | 云原生Prometheus监控之企业网站指标采集预警及可视化大盘展示
    chrome谷歌浏览器离线安装axure插件打开页面原型
    JDK对String操作优化
    【VIO】第3讲 基于滑动窗口算法的VIO
    图片转excel软件有哪些?这些软件你值得拥有
  • 原文地址:https://blog.csdn.net/qq_31564573/article/details/127125976