java程序启动时常见的设置参数和jps,jstack,jmap命令

363 阅读5分钟

java运行时常见的参数

-XX:+PrintCommandLineFlags             #查看当前用的是哪个垃圾回收器算法
-Xms512m                               #分配堆最小内存(初始堆大小),默认为物理内存的1/64,空余堆内存小于40%时,jvm就会增大堆内存大小直到xmx
-Xmx1024m                              #分配堆最大内存,默认为物理内存的1/4,默认空余堆内存大于70%,jvm就会减小堆内存大小直到xms
-Xss256k                               #每个线程的堆栈大小,jdk5.0后每个线程堆栈大小为1M,以前每个线程堆栈大小为256k,根据应用的线程所需内存
                              #大小进行调整.在相同物理内存下,减小该值能生成更多的线程,但是操作系统对一个进程的线程数一般限制在3000
                                #-5000左右. 一般小的应用可以设置为128k,大的建议设置为256k.
                                                                        
-Xmn1000m                              #设置年轻代大小,设置了这个 -xx:NewRatio 将失效
-XX:survivoRatio                       #两个survivo区和eden的比
-XX:NewRatio                           #设置新生代和老年代的比值 默认3 新生代 占三分之一  老年代 三分之二
        

-XX:MaxTenuringThreshold             #控制新生代需要经历多少次GC晋升到老年代中的最大阈值

-XX:+UseSerialGC                        #:设置串行收集器               Serial + Serial Old
-XX:+UseParallelGC                      #:设置并行收集器             Parallel Scavenge + Serial Old 
                                        #从JDK7u4开始,就对 “-XX:+UseParallelGC” 默认的老年代收集器进行了改进,改进使得HotSpot VM在选择使用 “-XX:+UseParallelGC” 时,
                                        #会默认开启 " -XX:+UseParallelOldGC “,也就是说默认的老年代收集器是 Parallel Old。
                                        # 综上,JDK8中默认的选择是”-XX:+UseParallelGC",是 Parallel Scavenge + Parallel Old组合。
-XX:+UseParalledlOldGC                  # :设置并行年老代收集器   rallel Scavenge + Parallel Old
-XX:+UseConcMarkSweepGC                 #:设置并发收集器
-XX:+UseG1GC

-XX:+PrintGCDetails
-XX:+PrintHeapAtGC                 #打印GC前后的详细堆栈信息
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path  #让JVM在遇到OutOfMemoryError时自动生成Dump文件

命令

jps
jps
#常用
jps -l
jps -v

#-q:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
#-mlvV:我们可以指定这些参数的任意组合。
#-m:显示Java虚拟机启动时传递给main()方法的参数。
#-l:显示主类的完整包名,如果进程执行的是JAR文件,也会显示JAR文件的完整路径。
#-v:显示Java虚拟机启动时传递的JVM参数。
#-V:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
#hostid:指定的远程主机,可以是ip地址和域名, 也可以指定具体协议,端口。如果不指定,则显示本机的Java虚拟机的进程信息。
#-help:显示jps命令的帮助信息。

jstack

jstack命令用于生成虚拟机当前时刻的线程快照。

#jstack [ option ] pid 
#jstack [ option ] executable core 
#jstack [ option ] [server-id@]remote-hostname-or-IP 
#option 参数说明如下:
#-F    当正常输出的请求不被响应时,强制输出线程堆栈
#-m    如果调用到本地方法的话,可以显示C/C++的堆栈
#-l    除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

Java语言定义了6种线程池状态:

  • New:创建后尚未启动的线程处于这种状态,不会出现在Dump中。
  • RUNNABLE:包括Running和Ready。线程开启start()方法,会进入该状态,在虚拟机内执行的。
  • Waiting:无限的等待另一个线程的特定操作。
  • Timed Waiting:有时限的等待另一个线程的特定操作。
  • 阻塞(Blocked):在程序等待进入同步区域的时候,线程将进入这种状态,在等待监视器锁。
  • 结束(Terminated):已终止线程的线程状态,线程已经结束执行。

Dump文件的线程状态一般其实就以下3种:

  • RUNNABLE,线程处于执行中
  • BLOCKED,线程被阻塞
  • WAITING,线程正在等待

jmap
jmap的作用:

监控内存内的Java对象

语法
  • jmap [option] (to connect to running process)
  • jmap [option] <executable (to connect to a core file)
  • jmap [option] [server_id@] (to connect to remote debug server)
选项说明

option:命令选项,常用选项如下:

  • -heap: 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
  • -histo[:live]: 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象;
  • -permstat 打印永久代统计信息;
  • -finalizerinfo 打印等待回收的对象信息
  • -dump: 以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看;
dump-options选项:
  • live 只输出活着的对象;不指定,则输出堆中所有对象
  • format=b 指定输出格式为二进制
  • file= 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=D:\heap.bin
  • -F 与-dump: 或-histo一起使用,当没有响应时,强制执行;注意:不支持live子选项
  • pid: 进程id

######例: jmap -heap pid

 jmap -heap pid
 
 > jmap -heap 10352
jmap -heap 10352
Attaching to process ID 10352, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(defalut 40)
   MinHeapFreeRatio         = 0 
   //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapFreeRatio         = 100
   //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   MaxHeapSize              = 4280287232 (4082.0MB)
   //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   NewSize                  = 89128960 (85.0MB)
   //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   MaxNewSize               = 1426587648 (1360.5MB)
   //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老年代’的大小
   OldSize                  = 179306496 (171.0MB)
   //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   NewRatio                 = 2
   //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
   SurvivorRatio            = 8
   //对应jvm启动参数-XX:MetaspaceSize=<value>:设置JVM堆的‘元空间’的初始大小
   // jdk1.8 永久代已经被元空间所取代
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   //对应jvm启动参数-XX:MaxMetaspaceSize= :设置JVM堆的‘元空间’的最大大小
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
//堆内存分布
Heap Usage:
//新生代的内存分布
PS Young Generation
//Eden区内存分布
Eden Space:
   //Eden区总容量
   capacity = 1425539072 (1359.5MB)
   //Eden区已使用
   used     = 28510792 (27.19001007080078MB)
   //Eden区剩余容量
   free     = 1397028280 (1332.3099899291992MB)
   //Eden区使用比率
   2.0000007407724003% used
From Space:
   capacity = 524288 (0.5MB)
   used     = 65536 (0.0625MB)
   free     = 458752 (0.4375MB)
   12.5% used
To Space:
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
PS Old Generation
   capacity = 128974848 (123.0MB)
   used     = 24006808 (22.894676208496094MB)
   free     = 104968040 (100.1053237915039MB)
   18.613557893086256% used

13410 interned Strings occupying 1194568 bytes.
 
jmap -histo pid
jmap -histo:live pid
jmap -dump:live,format=b,file=a.log pid

参考:juejin.cn/post/684490…