java服务常用工具

411 阅读4分钟

java 常见问题处理

  • java 服务器 cpu 达到 100%定位方法

    • 用 top 命令,按大 P 进行 cpu 排序,按 M 内存排序,找到 java 进程 pid。进程少可用 jps -l 找到 pid
    • 用 top -Hp pid 命令,看 pid 下各线程的 cpu 使用情况,找到最高线程 tid
    • 用 printf "%x\n" tid 命令,转换线程号为 16 进制
    • 用 jstack pid | grep '0xtid 的 16 进制' -C10 --color 命令,分析堆栈信息定位代码

java 参数

其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,这些都是不稳定的并且不推荐在生产环境中使用。

# 内存公式
# 年老代大小 = Xmx - Xmn
# 整个堆大小 = 年轻代大小 + 年老代大小 + 持久代大小

# jvm自动分配的heap大小取决于机器配置
java -XX:+PrintFlagsFinal -version | grep -Ei "maxheapsize|maxram"

# MaxHeapSize = MaxRAM * 1 / MaxRAMFraction
# MaxRAMFraction 默认是4,意味着,每个jvm最多使用25%的机器内存
# JVM内存  = heap 内存 + 线程stack内存 (XSS) * 线程数 + 启动开销(constant overhead)
# -Xmx 设置heap内存
java -XX:+PrintFlagsFinal -Xmx1g -version | grep -Ei "maxheapsize|maxram"

# -XX:+UseContainerSupport允许JVM 从主机读取cgroup限制,例如可用的CPU和RAM,并进行相应的配置。这样当容器超过内存限制时,会抛出OOM异常,而不是杀死容器。
# 该特性在Java 8u191 +,10及更高版本上可用。
# 注意,在191版本后,-XX:{Min|Max}RAMFraction 被弃用,引入了-XX:MaxRAMPercentage,其值介于0.0到100.0之间,默认值为25.0。
java -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0

# -Xms 与 - Xmx 相同可避免每次垃圾回收完成后 JVM 重新分配内存
java -Xms512m -Xmx512m

# 年轻代,持久代一般固定大小为 64m,增大年轻代将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8
java -Xmn200m

# 打印gc日志
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dump.hprof -XX:+PrintGC -XX:+PrintGCDetails -Xloggc:/opt/gc.log


# 实际使用
java -Xms2G -Xmx2G -Xmn1G -Xss1M -XX:PermSize=128M -XX:MaxPermSize=128M -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=4m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:ParallelGCThreads=3 -Dspring.cloud.nacos.discovery.ip=172.17.0.18 -Dspring.cloud.nacos.discovery.port=8080 -Dserver.port=8080 -Dspring.profiles.active=uat -Dapollo.configService=http://10.223.12.32:8080 -Dspring.cloud.nacos.config.server-addr=10.223.12.40:8848 -Dspring.cloud.sentinel.transport.dashboard=10.223.12.44:8858

jps

  • jps JVM Process Status Tool
jps

# 只显示 pid
jps -q

# 显示 pid 和 参数
jps -m

# 输出 Java 进程的进程 ID 和主类全名
jps -l

jinfo

# 查看标志参数
jinfo -flags pid

# 查看系统属性
jinfo -sysprops pid

# 查看特定标志参数的值
jinfo -flag UseG1GC pid

jstat

  • 性能监控工具
# 类加载统计
jstat -class pid

# 编译统计
jstat -compiler pid

# 垃圾回收统计
jstat -gc pid

jstat -gcutil pid

jstack

  • Java Stack Trace 用于生成 Java 进程的线程转储信息。它可以显示每个线程的堆栈跟踪,帮助您找出可能的死锁、死循环和线程问题
# 显示线程堆栈
jstack pid

# 显示线程堆栈和锁信息
jstack -l pid

# 显示线程堆栈和每个线程的本地(本地方法)信息
jstack -m pid

jmap

  • jmap Java Memory Map 用于生成 Java 进程的内存映射信息。它提供了堆的详细信息,包括 Java 堆内存、对象统计和内存使用情况的详细信息,可以帮助开发人员分析内存泄漏、内存使用情况等问题
# 显示 Java 堆内存中的对象统计信息
jmap -histo pid

# 查看大对象
jmap -histo pid | less

# 查看对象数最多的对象,并按降序排序输出
jmap -histo pid | grep com |sort -k 2 -g -r|less

# 查看占用内存最多的最象,并按降序排序输出
jmap -histo pid | grep com |sort -k 3 -g -r|less

# 导出堆文件,将堆内存转储到文件
jmap -dump:format=b,file=heapdump.bin pid

# 强制导出堆文件,强制触发FGC导出堆存储到文件
jmap -dump:live,format=b,file=heap.bin pid

# 分析堆文件,使用 MAT 分析工具,如 jhat 命令,eclipse 的 mat 插件
jhat -port 5000 heap.bin

# 显示内存使用情况,在用 cms gc 的情况下,有些时候会导致进程变 T,因此强烈建议别执行这个命令
jmap -heap pid