Fork me on GitHub

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:查看服务器内存使用情况

image

  • 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的任务管理器。

image

  • 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,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值。

image

  • 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堆内存的使用情况.

image
如图采用的是G1垃圾回收器,堆内存的大小为6g

jmap -histo:live 9906 | more 查看堆内存中存活的对象数目、大小、类型

image

  • 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秒钟打印一次内存情况

image

参考

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

posted @ 2023-02-15 18:04  晨度  阅读(182)  评论(0编辑  收藏  举报