JVM调优

本文是其他地方搜集整理而来,方便我复习。

-Xms20M  starting
-Xmx     max
-Xmn     new

对象分配eden
-XX:SurvivorRatio=8
8:1:1

TLAB  Thread Local Allaction Buffer

对象很大
    -XX:PretenureSizeThreshold=3145728   3M
长期存活的对象 
    -XX:MaxTenuringThreshold=15
动态对象年龄判定
    相同年龄所有对象的大小总和 > Survivor空间的一半
    
分配担保
    Minor GC 之前检查 老年代最大可用连续空间是否>新生代所有对象总空间
    
    
Minor GC  
Major GC
Full  GC
    
什么样的对象需要回收?
判断算法
引用
    强  Object object = new Object();
    软  
    弱  
    虚  
    
回收
    方法论
        标记-清除算法
        复制回收算法
        标记-整理算法
    垃圾收集器
        STW  Stop The World
        Serial
        ParNew 
            -XX:ParallelGCThreads
        Parallel Scavenge (全局)
            吞吐量 = 运行用户代码时间 / (运行用户代码时间  + 垃圾收集时间)
            -XX:MaxGCPauseMillis=n
            -XX:GCTimeRatio=n
            -XX:UseAdaptiveSizePolicy   GC  Ergonomics
        Serial Old
            CMS备用预案  Concurrent Mode Failusre时使用
            标记-整理算法
        Parallel Old
            标记-整理算法
        CMS
            标记-清除算法
            减少回收停顿时间
            碎片 -XX:CMSInitiatingOccupancyFraction  
            Concurrent Mode Failure 启用Serial Old
            
            -XX:+UseCMSCompactAtFullCollection
            -XX:CMSFullGCsBeforeCompaction 执行多少次不压缩FullGC后 来一次带压缩的 0 表示每次都压
            -XX:+UseConcMarkSweep
        G1
            
回收的时间节点
    
如何查看当前的垃圾回收器
    -XX:+PrintFlagsFinal
    -XX:+PrintCommandLineFlags
    server client
    MBean
    
GC日志
    1.输出日志
    -XX:+PrintGCTimeStamps 
    -XX:+PrintGCDetails 
    -Xloggc:/home/administrator/james/gc.log
    -XX:+PrintHeapAtGC
    2.日志文件控制
    -XX:-UseGCLogFileRotation
    -XX:GCLogFileSize=8K
    3.怎么看
    
JDK自带的 监控工具
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/toc.html
    jmap -heap pid 堆使用情况
    jstat  -gcutil pid 1000
    jstack  线程dump 
    jvisualvm
    jconsole
    
MAT
    http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
    -XX:+HeapDumpOnOutOfMemoryError 
    -XX:HeapDumpPath=/home/administrator/james/error.hprof

怀疑:
    1.看GC日志  126719K->126719K(126720K)
    2.dump
    3.MAT
        1.占用Retained Heap
        2.看有没有GC Root指向
    
    
VM参数
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
    

什么条件触发STW的Full GC呢?
Perm空间不足;
CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);
(promontion faild产生的原因是EDEN空间不足的情况下将EDEN与From survivor中的存活对象存入To survivor区时,To survivor区的空间不足,再次晋升到old gen区,而old gen区内存也不够的情况下产生了promontion faild从而导致full gc    )

统计得到的Young GC晋升到老年代的平均大小大于老年代的剩余空间;

主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题。
    
    
java -Xms8m -Xmx64m -verbose:gc -Xloggc:/home/administrator/james/gc.log  -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=177.1.1.122 -jar jvm-demo1-0.0.1-SNAPSHOT.jar  > catalina.out  2>&1 &

java -Xms128m -Xmx128m -verbose:gc -Xloggc:/home/administrator/james/gc.log  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/administrator/james/error.hprof -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC  -XX:+UseCMSCompactAtFullCollection -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=177.1.1.122 -jar jvm-demo1-0.0.1-SNAPSHOT.jar  > catalina.out  2>&1 &
     
java -Xms128m -Xmx128m -verbose:gc -Xloggc:/home/administrator/james/gc.log  -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintHeapAtGC -XX:HeapDumpPath=/home/administrator/james/error.hprof -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGCDetails -XX:+UseCMSCompactAtFullCollection -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=177.1.1.122 -jar jvm-demo1-0.0.1-SNAPSHOT.jar  > catalina.out  2>&1 &
     

-XX:+CMSScavengeBeforeRemark
    
    
    
    
    
    
 

你可能感兴趣的:(jvm)