记一次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 看当前文件下所有目录文件的大小(明细版)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值