目录
常见配置
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
回收机制
年轻代(Young Generation) 年老代(Old Generation) 持久代(Permanent Generation)
年轻代包括(一个Eden区,两个Survivor区:对称没先后关系)
- 大部分对象在Eden区中生成,
- Eden区满时,还存活的对象将被复制到Survivor区
- 第一个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区
- 第二个Survivor区也满时,Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”
年老代 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此年老代中存放的都是一些生命周期较长的对象
持久代 存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响
GC有两种类型:Scavenge GC和Full GC。
Scavenge GC //清理年轻代
新对象生成,并且在年轻代的Eden区申请空间失败时,就会触发Scavenge GC对Eden区域进行GC,清除非存活对象。不会影响到年老代
Full GC //清理年老代
对整个堆进行整理,比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:
· 年老代(Tenured)被写满
· 持久代(Perm)被写满
· System.gc()被显示调用
· 上一次GC之后Heap的各域分配策略动态变化
Jvm监控工具
JDK自带一些工具,如Jstack , jmap ,
jstack , 输出的线程信息主要包括:jvm自身线程、用户线程等。
jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。
jstack <pid>,用于打印指定Java进程的线程堆栈信息。
jmap , 打印Java进程的共享对象内存映射或堆内存细节
jmap -histo <pid> 展示class的内存情况
jmap -histo:live <pid> 先触发gc,然后再统计信息
jmap -dump:format=b,file=<filename> <pid> 将进程的内存heap输出出到filename文件里,再配合内存分析工具MAT或与jhat使用,能够以图像的形式直观的展示当前内存是否有问题
Dump文件是Java堆使用情况的内存镜像。主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等
怀疑有内存泄漏的时候就可以制作Dump来查看具体情况
每一个java虚拟机都有及时生成显示所有线程在某一点状态的线程dump的能力
JVM中的许多问题都可以使用线程dump文件来进行诊断,其中比较典型的包括线程阻塞,CPU使用率过高,JVM Crash,堆内存不足和类装载等问题。