jvm常用:命令 、参数

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调用策略

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

    • 将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况
    • 大对象进入老年代,虽然大部分情况下,将对象分配在新生代是合理的。但是对于大对象这种做法却值得商榷,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配的老年代,破坏新生代的对象结构,可能会出现频繁的 full gc。因此,对于大对象,可以设置直接进入老年代(当然短命的大对象对于垃圾回收老说简直就是噩梦)。-XX:PretenureSizeThreshold 可以设置直接进入老年代的对象大小
    • 合理设置进入老年代对象的年龄,-XX:MaxTenuringThreshold 设置对象进入老年代的年龄大小,减少老年代的内存占用,降低 full gc 发生的频率。
    • 设置稳定的堆大小,堆大小设置有两个参数:-Xms 初始化堆大小,-Xmx 最大堆大小。
    • 如果满足下面的指标,则一般不需要进行 GC 优化:
      MinorGC 执行时间不到50ms;
      Minor GC 执行不频繁,约10秒一次;
      Full GC 执行时间不到1s;
      Full GC 执行频率不算频繁,不低于10分钟1次。
    复制代码
    

jvm常用命令

  • jps jps:显示当前用户的所有java进程的PID
    jps -v 3331:显示虚拟机参数
    jps -m 3331:显示传递给main()函数的参数
    jps -l 3331:显示主类的全路径

  • jstat jstat -gc 3331 250 20 :查询进程2764的垃圾收集情况,每250毫秒查询一次,一共查询20次
    jstat -gccause:额外输出上次GC原因
    jstat -calss:件事类装载、类卸载、总空间以及所消耗的时间

  • jmap jmap -histo 3331:查看堆内存(histogram)中的对象数量及大小
    jmap -heap 3331:查看java 堆(heap)使用情况
    jmap -histo:live 3331:JVM会先触发gc,然后再统计信息,查看堆内存中的对象数量及大小
    jmap -dump:format=b,file=heapDump 3331:将内存使用的详细情况输出到文件,之后一般使用其他工具进行分析

  • jstack jstack 3331:查看线程情况
    jstack -F 3331:正常输出不被响应时,使用该指令
    jstack -l 3331:除堆栈外,显示关于锁的附件信息

常见问题定位过程

  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查看所有的初始默认值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容