Java调优常用命令

本文详细介绍了常用的Shell命令,如查看网络状况、监控进程CPU使用率和内存占用,以及如何生成和分析Coredump。此外,还深入讲解了JDK命令,包括查看JVM进程、内存使用、垃圾收集以及配置示例。内容涵盖JVM内存配置、GC日志分析和优化策略,对于Java开发者进行性能调优极具参考价值。
摘要由CSDN通过智能技术生成

E1.常用Shell命令

  • 查看网络状况。

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
使用top命令获取进程CPU使用率,使用/proc文件查看进程所占内存。

#!/bin/bash
for i in `ps -ef | egrep -v "awk|$0" | awk '/'$1'/{print $2}'`
do
    mymem=`cat /proc/$i/status 2> /dev/null | grep VmRss | awk '{print $2" " $3}'`
    cpu=`top -n 1 -b |awk '/'$i'/{print $91}'`
done

  • Core转储快照。

Core dump是对内存的快照,可以从Core dump中转出Heap dump和Thread dump。
ulimit -c unlimited    (使得 JVM崩溃可以生成Core dump)
gcore [pid]     (主动生成 Core dump)
生成的Core dump 文件在CentOs 中位于用户当前工作目录下,形如core.[pid](可以通过 echo '/home/ogs/core.%p'> /proc/sys/kernel/core_pattern 修改位置), 此文件可以通过gdb、jmap和jstack 等进行分析,如下:
gdb -c [core文件] $JAVA_HOHE/bin/java # 进入gdb命今行后执行bt,显示程序的堆栈信息
jmap -heap $JAVA_HoNE/bin/java [Core文件]
jstack $JAVA_HOME/bin/java [Core文件]
gdb -c [core文件] $JAVA_HOHE/bin/java # 进入gdb命今行后执行bt,显示程序的堆栈信息
jmap -heap $JAVA_HoNE/bin/java [Core文件]
jstack $JAVA_HOME/bin/java [Core文件]

E.2常用JDK命令

  • 查看类的一些信息,如字节码的版本号、常量池等。

javap -verbose [className]

  • 查看JVM进程。

jps
jcmd -1

  • 查看进程的GC情况。

jstat -gcutil [pid] #显示总体情况
jstat -gc [pid]1000 10 #每隔1秒刷新1次,一共10次

  • 查看JVM堆内存使用状况。

jmap -heap [pid]

  • 查看JVM永久代使用状况。

jmap -permstat [pid] #适用于Java6、7
jmap -clstats [pid] #Java 8没有永久代,这里可以打印类加载器的状况

  • 查看JVM内存中存活的对象。

jcmd [pid] GC.class_histogram
jmap -histo:live [pid]

  • 把heap里所有对象都dump下来,无论对象是死是活。

jmap -dump:format=b,file=xxx.hprof [pid]

  • 先做一次Full GC,再dump,只包含仍然存活的对象信息。

jcmd [PID] GC.heap_dump [FILENAME]
jmap -dump:format=b,live,file=xxx.hprof [pid]

  • 线程dump

jstack [pid] #-m参数可以打印出 native 栈的信息
jcmd [pid] Thread.print
ki11-3[pid](在日志文件中输出)

  • 查看JVM启动的参数。

jinfo -flags [pid] #查看有效参数
jcmd [pid] VM.flags #查看所有参数

  • 查看对应参数的值。

jinfo -flag [flagName] [pid]

  • 启用/禁止某个参数。

jinfo -flag [+/-][flagName] [pid]

  • 设置某个参数。

jinfo -flag [flagName=value] [pid]

  • 查看所有可以设置的参数以及其默认值。

java -XX:+PrintFlagsInitial

  • 进行一次Full GC。

jcmd [pid] GC.run

E.3JVM配置示例

-server #在默认的64位机器下
-Xms6000M #最小堆大小
-Xmx6000M #最大堆大小
#-XX:+AggressiveHeap #一些激进的堆配置策略,包括将Xms和Xmx值设置为相同的值等,由于隐藏了很多调优工作,故不建议启用
-Xmn500M #新生代大小
-Xss256K #栈大小
-XX:PermSize=500M #永久代大小(JDK 7)
-XX:MaxPermSize=500M (JDK 7)
#-XX:MetaspaceSize=128m #元空间大小(JDK 8)
#-XX:MaxMetaspaceSize=512m (JDK 8)
-XX:SurvivorRatio=8 #Eden 区与Survivor 区的比例
-XX:MaxTenuringThreshold=0 #晋升到老年代需要的存活次数,设置为O时,Survivor 区失去作用,进行一次Minor GC,Eden区中存活的对象就会进入老年代,默认值是15,使用CMS时默认值是4
-Xnoclassgc #不做类的GC
#-XX:+PrintCompilation #输出JIT编译情况,慎用
-XX:+TieredCompilation #启用多层编译,JDK 8默认开启
-XX:CICompilerCount=4 #编译器数目增加
-XX:-UseBiasedLocking #取消偏向锁
-XX:AutoBoxCacheMax=20000 #自动装箱的缓存数量,如int默认缓存为-128~127
-Djava.security.egd=file:/dev/./urandom #替代默认的/dev/random阻塞生成因子
-XX:+AlwaysPreTouch #启动时访问并置零内存页面,大堆时效果比较好
-XX:-UseCounterDecay #禁止JIT调用计数器衰减。默认情况下,每次GC时会对调用计数器进行砍半操作,导致有些方法一直是个温热(虽然频繁调用但一直达不到设置的热点阔值),可能永远都达不到C2编译的10000次的阀值
-XX:ParallelRefProcEnabled=true #默认值是false,并行地处理Reference 对象,如WeakReference
-XX+DisableExp1icitGC #此参数会影响使用堆外内存,会造成OOM,如果使用NIO,请慎重开启
#-XX:+UseParNewCC +此参数在设置了CMS后会默认启用,可以不用设置
-XX:+UseConcMarkSweepGC #使用CMS 垃圾回收器
#-XX:+UseCMSCompactAtFul1Collection #是否在Ful1 GC时做一次压缩以整理碎片,默认启用
-XX:CMSFul1GCsBeforeCompaction=0 #Ful1 GC触发压缩的次数
#-xx:+CMSParallelRemarkEnabled #并行标记,默认开启,可以不用设直
#-XX:+CMSScavengeBeforeRemark #强制 remark之前开始一次Minor Gc,减少remark的暂停时间、但是在remark之后将立即开始又一次Minor GC
-XX:+UsecmsInitiatingOccupancyOnly 非只根据老年代空间占用率来决定何时启动垃圾回收线程
-XX:CMSInitiatingOccupancyFraction=90 #触发Ful1 GC的内存使用百分比
-XX:+CMSPermGenSweepingEnabled #CMS每次回收同时清理永久代中的垃圾
#-XX:CMSInitiatingPermOccupancyFraction=80 触发永久代清理的永久代使用百分比
#-XX:+CMSClassUnloadingEnabled +如果类加载不频繁,也没有大量使用String.intern方法,则不建议打开此参数,况且JDK 7后String poo1已经移动到了堆中。在最新版本的JDK 8中,此选项默认值变为true,但只要设置了-Xnoclassgc,则此选项就会失效
-XX:+PrintClassHistogram #打印堆直方图
-XX:+PrintHeapAtGC #打印 GC前后的heap信息
-XX:+PrintGCDetails #以下都是GC日志相关参数
-XX:+PrintGCDateStamps #打印可读日期
-XX:+PrintGCApplicationStoppedTime #除打印清晰的GC停顿时间外,还可以打印其他的停顿时间,比如取消偏向锁、类被agent redefine、code deoptimization等
-XX:+PrintTenuringDistribution #打印晋升到老年代的年龄自动调整的情况(并行垃圾回收器(在启用UseAdaptiveSizePolicy参数的情况下)以及其他垃圾回收器也会动态调整,从最开始的MaxTenuringThreshold变成占用当前堆50%的age)
#-XX:+UseAdaptiveSizePolicy #此参数在并行回收器时是默认开启的,开启时会根据应用运行状况做自我调整,包括MaxTenuringThreshold、Survivor 区大小等,其他情况下最好不要开启
#-XX:StringTableSize #字符串常量池表大小(HashTable的Bucket的数目),Java6u30之前无法修改,固定值是1009,后面的版本默认值是60013,可以通过此参数设置
-XX:GCTimeLimit=98 #GC占用时间超过多少抛出OutOfMemoryError
-XX:GCHeapFreeLimit=2 #GC 回收后小于百分之多少抛出 OutOfMemoryError
-Xloggc:/home/1ogs/gc.1og #GC日志路径
#-XX:+UseGCLogFileRotation #开启GC 日志滚动输出
#-XX:NumberOfGCLogFiles=100#轮转日志数目最大为100,超过则覆盖
#-XX:GCLogFileSize=100M #GC轮转日志最大大小100MB,超过则另起一个日志文件
-XX:+HeapDumpOnOutOfMemoryError #在OOM发生时,JVM将要crash之前,输出Heap
#-XX:+HeapDumpBeforeFullGc #Ful1 GC前进行一次堆转储
#-XX:+HeapDumpAfterFul1GC #Ful1 GC后进行一次堆转储
-XX:HeapDumpPath=[path] #堆转储文件的保存位置
-XX:ErrorFile=/home/1ogs/hs_err_%p.log #当 JVM crash 时,HotSpot会生成一个error文件,提供JVM状态信息的细节

java -server -jar -Xmx4g -Xms4g -Xmn2g -XX:SurvivorRatio=8 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCTimeStamps -Xloggc:/neworiental/web/k12-paper-api/logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M ./k12-testing-admin.jar --spring.profiles.active=fat

nohup java -server -jar -Xmx4g -Xms4g -Xmn2g -XX:SurvivorRatio=8 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCTimeStamps -Xloggc:/back/web/voc/logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M ./voc-web-1.0-SNAPSHOT.jar --spring.profiles.active=dev &
 tail -f ./my.log

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值