jvm常用:命令 、参数

2021-03-23  本文已影响0人  虾米咬小米

jvm 常用命令:

打印 jvm所有参数(已更改):   java -XX:+PrintFlagsFinal -version 
查看初始默认值:     java -XX:+PrintFlagsInitial


查看栈内存参数:   java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

java -XX:+PrintFlagsFinal -version 查看所有jvm参数

如下:

有冒号的代表要么是jvm根据你自身机器的特点修改的值, 要么是你人为修改的值, 就会出现冒号.

   intx MaxInlineLevel                            = 9                                   {product}
     intx MaxInlineSize                             = 35                                  {product}
     intx MaxJNILocalCapacity                       = 65536                               {product}
     intx MaxJavaStackTraceDepth                    = 1024                                {product}
     intx MaxJumpTableSize                          = 65000                               {C2 product}
     intx MaxJumpTableSparseness                    = 5                                   {C2 product}
     intx MaxLabelRootDepth                         = 1100                                {C2 product}
     intx MaxLoopPad                                = 11                                  {C2 product}
    uintx MaxMetaspaceExpansion                     = 5451776                             {product}
    uintx MaxMetaspaceFreeRatio                     = 70                                  {product}
    uintx MaxMetaspaceSize                          = 18446744073709547520                    {product}
    uintx MaxNewSize                               := 683671552                           {product}
     intx MaxNodeLimit                              = 75000                               {C2 product}
 uint64_t MaxRAM                                    = 137438953472                        {pd product}
    uintx MaxRAMFraction                            = 4                                   {product}
   double MaxRAMPercentage                          = 25.000000                           {product}
     intx MaxRecursiveInlineLevel                   = 1                                   {product}
    uintx MaxTenuringThreshold                      = 15                                  {product}
     intx MaxTrivialSize                            = 6                                   {product}
     intx MaxVectorSize                             = 32                                  {C2 product}
    uintx MetaspaceSize                             = 21807104                            {pd product}
     bool MethodFlushing                            = true                                {product}


格式如下:

Type | Name | Operator | Value | Application

product – 官方支持, JVM内部选项

rw – 可动态写入的.

C1 – Client JIT 编译器

C2 – Server JIT 编译器

pd – platform Dependent 平台独立

lp64 – 仅 64 位JVM

manageable – 外部定义的并且是可动态写入的.

diagnostic – 用于虚拟机debug的

experimental – 非官方支持的

jvm参数简介

-XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。如果此类参数设置合理将大大提高JVM 的性能及稳定性。

不稳定参数语法规则:

    1.布尔类型参数值
        -XX:+<option> '+'表示启用该选项
        -XX:-<option> '-'表示关闭该选项
    2.数字类型参数值:
        -XX:<option>=<number> 给选项设置一个数字类型值,可跟随单位,例如:'m'或'M'表示兆字节;'k'或'K'千字节;'g'或'G'千兆字节。32K与32768是相同大小的。
    3.字符串类型参数值:
        -XX:<option>=<string> 给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。 例如:-XX:HeapDumpPath=./dump.core
复制代码

项目中常用配置

参数设置 描述 配置格式
-Xms 初始化堆空间大小 -Xms64m (一般为操作系统可用内存的1/64大小)
-Xmx 最大堆空间大小 -Xmx2048m (一般为操作系统可用内存的1/4大小)
-Xmn 年轻代的空间大小 -Xmn32m
-Xss 设置线程栈空间大小 -Xss512k
-XX:MaxnewSize 堆的新生代可被分配的内存的最大上限 (注意:该值需要小于-Xmx的值)。
-XX:PermSize 永久代空间大小(JDK8永久代已废弃) -XX:PermSize=256m
-XX:MaxPermSize 最大永久区大小(JDK8永久代已废弃) -XX:MaxPermSize=256m
-XX:+UseStringCache 启用缓存常用字符产 -
-XX:+UseConcMarkSweepGC 老年代使用cms收集器 -
-XX:+UseParNewGC 新生代使用并行收集器 -
-XX:+ParallelGCThreads 设置并行线程数量 -XX:+ParallelGCThreads=4
-XX:+CMSClassUnloadingEnabaled 允许对类元数据进行清理 -
-XX:+DisableExplicitGC 禁止显示GC -
-XX:+UseCMSInitiatingOccupancyOnly 表示达到阀值之后才进行CMS回收 -
-XX:+CMSInitiatingOccupanyFraction 设置CMS老年代回收阀值百分比 -XX:+CMSInitiatingOccupanyFraction=68
-verbose:gc 输出虚拟机GC详情 -
-XX:+PrintGCDetails 打印GC详情 -
-XX:+PrintGCDateStamps 打印GC的耗时
-XX:+PrintTenuringDistribution 打印tenuring年龄信息 -
-XX:+HeapDumpOnOutOfMemoryError 当抛出OOM时进行HeapDump -
-XX:+HeapDumpPath 指定HeapDump的文件路径和目录 -

常用组合

Young Old JVM Option
Serial Serial -XX:+UserSerialGC
Parallel Parallel/Serial -XX:+UseParallelGC -XX:+UseParallelOldGC
Serial/Parnllel CMS -XX:+UseParNewGC -XX:+UseConcSweepGC
G1 - -XX:+UseG1GC

常用GC调用策略

   多数的 Java 应用不需要在服务器上进行 GC 优化;多数导致 GC 问题的 Java 应用,都不是因为我们参数设置错误,而是代码问题;在应用上线之前,先考虑将机器的 JVM 参数设置到最优(最适合);减少创建对象的数量;减少使用全局变量和大对象;GC 优化是到最后不得已才采用的手段;在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多。
复制代码
     GC低停顿;GC低频率;低内存占用;高吞吐量。
复制代码

jvm常用命令

常见问题定位过程

  1. 使用uptime查看当前load,发现load飙高

    ➜  ~ uptime
    13:29  up 23:41, 3 users, load averages: 10 10 10
    复制代码
    
  2. 使用top命令,查看占用CPU较高的进程ID

    ➜  ~ top
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1893 admin     20   0 7127m 2.6g  38m S 181.7 32.6  10:20.26 java
    复制代码
    

    发现PID为1893的进程占用CPU 181%,而且是一个Java进程,基本断定是软件问题

  3. 使用 top命令,查看具体是哪个线程占用率较高

    ➜  ~ top -Hp 1893
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    4519 admin     20   0 7127m 2.6g  38m R 18.6 32.6   0:40.11 java
    复制代码
    
  4. 使用printf命令查看这个线程的16进制

    ➜  ~ printf %x 4519
    11a7
    复制代码
    
  5. 使用jstack命令查看当前线程正在执行的方法

    ➜  ~ jstack 1893 |grep -A 200 11a7
    复制代码
    
  6. 使用jmap内存使用的详细情况输出到文件,之后一般使用其他工具进行分 析

    ➜ ~ jmap -dump:format=b,file=heapDump 1893
    复制代码
    

参考:
JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
打印JVM所有参数列表的方法 java -XX:+PrintFlagsFinal -version
JVM查看所有的初始默认值

上一篇 下一篇

猜你喜欢

热点阅读