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中的参数
![在这里插入图片描述](https://img-blog.csdnimg.cn/bd3c007cc6954b7588437d25614ffa62.png)
3.2 jmap
语法:jmap [option] pid
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c0545b90c144306abecccd7c1101b4f.png)
3.2.1 jmap 看堆内存使用情况
jmap -heap 119251 堆内存的使用情况
![在这里插入图片描述](https://img-blog.csdnimg.cn/a4908a2dd36d475b84ac72199512e648.png)
3.2.2 jmap 导出堆快照
-dump 有个选择只选择存活的对象
jmap -dump:live,format=b,file=dump2.dump(文件名) 进程pid
![在这里插入图片描述](https://img-blog.csdnimg.cn/97ed7beba9104d73b3facaa6c4fa0a53.png)
–histo查看存活对象/最大的前n个对象
jmap –histo:live pid
![在这里插入图片描述](https://img-blog.csdnimg.cn/ac4c795c56d347b2b10c72101a1053fb.png)
jmap –histo:live 112386|head -10
![jmap –histo:live 112686](https://img-blog.csdnimg.cn/ce49eed5eda94db496607541e410a422.png)
备注:要获得某个对象的大小,可以将其总大小除以该对象类型的数量。如果指定了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
![在这里插入图片描述](https://img-blog.csdnimg.cn/5e6f7d43a8774b1da0b37238603d766f.png)
查看大对象直接进入老年代内存的大小 0 默认所有对象都会在eden区创建
jinfo -flag PretenureSizeThreshold pid
![在这里插入图片描述](https://img-blog.csdnimg.cn/cc0ad9db493745b2855b8874c48f3279.png)
增加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 必须显示声明下图是为做声明的两次
![在这里插入图片描述](https://img-blog.csdnimg.cn/d58042c8594245b2b178e722b1ff1ff6.png)
最大对象定义
PretenureSizeThreshold 设置对象直接进入年老代的门槛,默认0 意味着所有对象都会在现在新生代分配内存。
![在这里插入图片描述](https://img-blog.csdnimg.cn/58fbf484bb1e481493b41f50be12f33e.png)
linux 命令
free info看linux内存情况
![在这里插入图片描述](https://img-blog.csdnimg.cn/2dbfbc59e38f48d09ea3f5890b470371.png)
lscpu 看linxu的cpu信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/58e932d6141f40d5a392dc7e2b1046d5.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4ff29ff7a8a84505a801ec1ec3bfc2a0.png)
du –sh 看当前文件夹大小
du –h 看当前文件下所有目录文件的大小(明细版)