JVM参数调优

jvm运行时的区域:

  • 共享区:heap,method(Non-heap,非堆内存)
  • 线程独有:JVM栈,本地栈,PC

GC:garbage Collector,垃圾收集器
垃圾回收方式:

  • 增量回收
  • 分代回收:将垃圾基于生命周期分类后基于不同生命周期的垃圾进行回收,分为新生代、老年代、持久代。Eden(新生代),From Survivor(存活区0),TO Survivor(存活区1)

垃圾回收机制:

  • 串行
  • 并行(STP:stop the world),将所有的进程停止,并发进行垃圾处理,处理完后再运行进程。
  • 并发

垃圾回收算法:
新生代:

Serial
ParNew
Parallel Scavenge:吞吐量

老年代:

Serial Old:单GC线程回收老年代中不再被使用的对象
Parallel Old:多GC线程回收老年代中不再被使用的对象
CMS(Concurrent Mark Sweep):以获得最短回收停顿时长为目标,是互联网站点服务端的B/S系统上较佳的回收算法;
    标记-清除
    整个过程分为四个阶段:
        初始标记
        并发标记
        重新标记
        并发清除

G1:Garbage First
并行和并发,分代收集,空间整合,可预测的停顿

标记-整理
初始标记
并发标记
最终标记
筛选回收

调优jvm内存空间的常用参数

-Xmx:堆内存(新生代和老年代)的最大空间;
-Xms:初始分配内存空间;
-XX:NewSize:新生代空间大小;
-Xms-(-XX:NewSize)
-XX:MaxNewSize:新生代的最大空间;
-Xmx-(-XX:MaxNewSize)
-XX:NewRatio:新生代除以老年代的值;
-XX:SurvivorRation:Eden/Survivor=

-Xss:设置线程私有的栈空间大小;

指定垃圾收集器:
-XX:

  • UseSerialGC:运行于Client模式下,新生代是Serial, 老年代使用SerialOld

  • UseParNewGC:新生代使用ParNew,老年代使用SerialOld

  • UseParalellGC:运行于server模式下,新生代使用Serial Scavenge, 老年代使用SerialOld

  • UseParalellOldGC:新生代使用Paralell Scavenge, 老年代使用Paralell Old

  • UseConcMarkSweepGC:新生代使用ParNew, 老年代优先使用CMS,备选方式为Serial Old

    CMSInitiatingOccupancyFraction:设定老年代空间占用比例达到多少后触发回收操作,默认为68%;
    UseCMSCompactAtFullCollection:CMS完成内存回收后是否要进行内存碎片整理;
    CMSFullGCsBeforeCompaction:在多少次回收后执行一次内存碎片整理;

  • ParalellGCThreads:并行GC线程的数量;

显示垃圾回收的统计信息:

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps

示例:

1
2
~]#vim /etc/tomcat/tomcat.conf 
JAVA_OPTS="-Xmx1g -Xms512m -XX:NewRatio=2 -XX:SurvivorRatio=3 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:PrintGC"

jvm常用命令

JVM常用的分析工具:

jps:用来查看运行的所有jvm进程;
jinfo:查看进程的运行环境参数,主要是jvm命令行参数;
jstat:对jvm应用程序的资源和性能进行实时监控;
jstack:查看所有线程的运行状态;
jmap:查看jvm占用物理内存的状态;
jhat:+UseParNew
jconsole:
jvisualvm:

jps:Java virutal machine Process Status tool,

jps [-q] [-mlvV] [<hostid>]
    -q:静默模式;
    -v:显示传递给jvm的命令行参数;
    -m:输出传入main方法的参数;
    -l:输出main类或jar完全限定名称;
    -V:显示通过flag文件传递给jvm的参数;
    [<hostid>]:主机id,默认为localhost;

jinfo:输出给定的java进程的所有配置信息;

jinfo [option] <pid>
    -flags:to print VM flags
    -sysprops:to print Java system properties
    -flag <name>:to print the value of the named VM flag

jstack:查看指定的java进程的线程栈的相关信息;

jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
    -l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项;
    -m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息;
    -F:当使用“jstack -l PID"无响应,可以使用-F强制输出信息;

jstat:输出指定的java进程的统计信息

jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]
# jstat -options
    -class:class loader
    -compiler:JIT
    -gc:gc
    -gccapacity:统计堆中各代的容量
    -gccause:
    -gcmetacapacity
    -gcnew:新生代
    -gcnewcapacity
    -gcold:老年代
    -gcoldcapacity
    -gcutil
    -printcompilation

[<interval> [<count>]]
    interval:时间间隔,单位是毫秒;
    count:显示的次数;

-gc:
    YGC:新生代的垃圾回收次数;
    YGCT:新生代垃圾回收消耗的时长; 
    FGC:Full GC的次数;
    FGCT:Full GC消耗的时长;
    GCT:GC消耗的总时长;

jmap:Memory Map, 用于查看堆内存的使用状态;
jhat:Java Heap Analysis Tool
jmap [option]

查看堆空间的详细信息:
jmap -heap

查看堆内存中的对象的数目:
jmap -histo[:live]
live:只统计活动对象;

保存堆内存数据至文件中,而后使用jvisualvm或jhat进行查看:

jmap -dump:<dump-options> <pid>
    dump-options:
    live         dump only live objects; if not specified, all objects in the heap are dumped.
    format=b     binary format
    file=<file>  dump heap to <file>