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 | ~]#vim /etc/tomcat/tomcat.conf |
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>