JAVA线上参数设置及常见问题
常用配置参数
- jar包启动配置命令
java -Xmx8g -Xms8g -XX:+UseG1GC -jar /home/pgcp/pgcp-0.0.1-SNAPSHOT.jar
- tomcat启动配置参数
在/bin/catalina.sh中/cygwin=false前加入下面一句
JAVA_OPTS='-Xmx8g -Xms8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/logs/HeapDump_Gc/项目名.hprof'
- 说明
- 一般只用配置-Xmx8g -Xms8g,且配置相同数值,这是因为其他参数tomcat会自动进行调节且为了防止 内存抖动(如果不同,CPU会进行不断的内存回收以及申请会增加CPU负担)。
- tomcat默认堆内存: 其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/logs/HeapDump_Gc/项目名.hprof,当系统发生OOM时,将会生成hprof文件,便于内存分析。
常用命令
free -h:查看服务器内存使用情况
- total:#服务器内存总大小:7.6G
- used:#已经使用了多少内存:3.8G
- free:#未被任何应用使用的真实空闲内存,也叫未被分配出去的内存,(真正尚未被使用的物理内存数)
- shared:#表示多个进程共享的内存总额
- buff/cache: #表示buffers和cache所用总量的总和(buffers为内核缓冲区所用的内存,
cache为页缓存和slabs所用的内存容量),也有人说是表示磁盘缓存的大小。 page cache,
即缓存文件内容+slab。slab也分可回收和不可回收部分,可手动回收,但是会在回收缓存这段时间影响主机性能,并且不是有所的slab和page cache都能被回收,正在使用的这些缓存不能被回收,否则系统的性能会很低,所以最后可能的内存是多少,就得评估能够回收的有多少,就有了下面这个参数available- buffers是用来缓冲文件属性和目录内容的(其实就是inode信息)
- cached是用来缓冲文件内容的(其实就是data block数据),为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
- available:真正剩余的可被程序应用的内存数;是系统的一个估计值,不是谁减比较准确
注意:看一个内存可用多少,看available参数,但是你要理解available的意义,不是简单数字相减;有时候也看free表示没有未被分配出去的内存。
top:是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
- load average:系统平均负载 每1分钟 5分钟 15分钟
- 单核处理器
假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load <1;当车占满整个马路的时候 load=1;当马路都站满了,而且马路外还堆满了汽车的时候,load>1。 - 多核处理器
我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。
假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。 - 什么样的Load average值要提高警惕
0.7 < load < 1: 此时是不错的状态,如果进来更多的汽车,你的马路仍然可以应付。
load = 1: 你的马路即将拥堵,而且没有更多的资源额外的任务,赶紧看看发生了什么吧。
load > 5: 非常严重拥堵,我们的马路非常繁忙,每辆车都无法很快的运行。 - 三种Load值,应该看哪个
通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。
1分钟负载值 > 1,那么我们不用担心,但是如果15分钟负载都超过1,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值。
- 单核处理器
- VIRT:virtual memory usage 虚拟内存
- 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
- 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
- RES:resident memory usage 常驻内存
- 进程当前使用的内存大小,但不包括swap out
- 包含其他进程的共享
- 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
- 关于库占用内存的情况,它只统计加载的库文件所占内存大小
- SHR:shared memory 共享内存
- 除了自身进程的共享内存,也包括其他进程的共享内存
- 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
- 计算某个进程所占的物理内存大小公式:RES – SHR
- swap out后,它将会降下来
- %CPU:上次更新到现在的CPU时间占用百分比
- %MEM:进程使用的物理内存百分比
jmap -heap PID打印heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆内存的使用情况.
如图采用的是G1垃圾回收器,堆内存的大小为6g
jmap -histo:live 9906 | more 查看堆内存中存活的对象数目、大小、类型
- num 序号
- instances 个数
- bytes 大小(字节)
- class name 类名
- B byte
- C char
- D double
- F float
- I int
- J long
- Z boolean
- [数组,如[I表示int[]
- [L+类名 其他对象
jstat -gc pid 1000 10 每隔1秒钟打印一次内存情况
参考
https://blog.csdn.net/u011069294/article/details/107393331
https://blog.csdn.net/ver_mouth__/article/details/124997432
https://www.cnblogs.com/aspirant/p/11525466.html
https://blog.csdn.net/weixin_43928833/article/details/120610925
https://blog.51cto.com/luckyshiliang/5215116
https://blog.csdn.net/lpw_cn/article/details/120701948
https://www.ngui.cc/el/909012.html?action=onClick
https://zhuanlan.zhihu.com/p/432258798
XFS