运行时数据区是规范,内存结构是具体实现。
官方运行时数据区定义html
CCS:压缩类空间,这个空间只有当启用了压缩类短指针时候,这个空间才会存在,在堆中分配的每个对象,都有一个指向本身的Class的一个指针,64位的虚拟机指针的长度是64位,若是考虑性能的缘由,咱们能够把这个指针采用短指针方式引用,采用32位指针,所引用的class文件都存储在压缩类空间。若是不启用短指针,那么压缩类空间就不存在。 CodeCache:存放的是JIT编译后的源代码,还有JVM执行的JNI Native代码。若是没有启用JIT即时编译,或者没有引用JNI方法,这块空间不存在。 Metaspace = Class、Package、Method、Method、Field、字节码、常量池、符号引用等等。 CCS:32位指针的Class。 CodeCache:JIT编译后的本地代码、JNI使用的C代码。
实例:
启用压缩类空间:
jstat -gc 13144
禁用压缩类空间:
jstat -gc 13523
codecache也是同样操做。
-xintjava
经常使用参数:git
C++和Java中内存泄露区别:在C++中New了一个对象,可是将该对象的指针丢失了,这就致使这个对象占用的内存永远得不到释放,就形成了内存泄露。在JAVA中New一个对象后,这个对象的指针一直被应用程序所持有,这样垃圾回收就不能将其释放,这样就致使内存泄露。
思想:枚举根节点,作可达性分析 根节点:类加载器、Thread、虚拟机栈的本地变量表、static成员、常亮引用、本地方法栈的变量等等。
标记清除:算法分为“标记”和“清除”两个阶段,首先标记出全部须要回收的对象,在标记完成后统一回收全部。缺点是效率不高,标记和清除两个过程的效率都不高;产生碎片,碎片太多会致使提早GC。 复制算法:它将可用内存按照容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块上面,而后再把已使用过的内存空间一次清理掉。优缺点是实现简单,运行高效,可是空间利用率低。 标记整理算法:标记过程仍然与“标记-清除”算法同样,但后续步骤不是直接对可回收对象进行清理,而是让全部存活的对象都向一端移动,而后直接清理掉端边界之外的内存。优缺点是没有了内存碎片,可是整理内存比较耗时。 分代垃圾回收:Young区采用复制算法,Old区采用标记清除或者标记整理算法。
对象分配:github
最理想的状况下,吞吐量最大的时候,停顿时间最小。现实中,这两个指标是互斥的,GC调优时候,很大部分工做就是如何权衡这两个变量。
串行收集器:算法
-XX:+UseSerialGC -XX:+UseSerialOldGC
并行收集器:windows
吞吐量优先, -XX:+UseParallelGC -XX:+UseParallelOldGC Server模式下的默认收集器,JVM会根据当前系统内存状况决定启用Server模式仍是Client模式,内存大于2G,JVM就会认为是Server模式。 jinfo -flag UseParallelGC 21669
并发收集器:多线程
在Java8中,有两个并发垃圾收集器,一个是CMS,一个是G1。 响应时间优先。 CMS: XX:+UseConcMarkSweepGC -XX:UseParNewGC G1: -XX:UseG1GC
如何选择垃圾收集器?官方指导垃圾收集器选取方法并发
工做原理:当发现内存不够时,暂停应用程序,启动多个垃圾回收线程来回收垃圾,垃圾回收结束后,从新启动应用程序。
-XX:+UseParallelGC 手动开启,server模式默认开启;
-XX:ParallelGCThreads=<n> 开启多少个GC线程;oracle
CPU > 8 ,N=5/8; CPU < 8 ,N=CPU;
并行收集器的自适应特性(Parallel Collector Ergonomics),会自动调整堆得大小,来自适应调整知足咱们设定的指标:app
并发收集 低停顿,低延迟 老年代收集器
(1)CMS垃圾收集过程
(2)CMS缺点
在G1垃圾收集器出现以前,CMS垃圾收集器使用很是普遍。
(3)CMS相关参数
实战:
查看Java应用使用哪种垃圾收集器:
触发FullGC的时机:
默认设置的是92%
(1)简介
The first focus of G1 is to provide a solution for users running applications that require large heaps with limited GC latency. This means heap sizes of around 6GB or larger, and a stable and predictable pause time below 0.5 seconds.
目标:知足大堆和短暂的停顿时间的要求;
G1是新生代和老年代收集器。
在JDK9中,已经将G1设置为默认的垃圾收集器。
(2)G1结构
G1是以Region为单位的。G1不像以前介绍的新生代、老生代垃圾收集器,虽说G1里面也有Young区和Old区这种概念,可是这只是逻辑上的概念。
G1将JVM内存分为一个小块一个小块,一个小块叫一个Region。一部分Region组成Young区,一部分Region组成Old区。
标记为H的Region,表示单独有一块存放大对象的区,若是对象大小超过Region大小的通常,就会存储在H Region中。
(3)G1的几个概念
(4)Yong GC
(5)Mixed GC
(6)Mixed GC相关参数
(7)G1相关参数
(8)G1最佳实践G1官方调优指南
(9)是否考虑切换到到G1
前面章节咱们知道评价一个垃圾收集器的好坏主要依据吞吐量和响应时间这两个指标,咱们在调优时,主要也是调整这两个值。可是咱们如何获得而且衡量这两个指标呢?这里咱们就须要进行GC日志分析。
Java HotSpot(TM) 64-Bit Server VM (25.161-b12) for windows-amd64 JRE (1.8.0_161-b12), built on Dec 19 2017 17:52:25 by "java_re" with MS VC++ 10.0 (VS2010) Memory: 4k page, physical 16687384k(9195396k free), swap 19177752k(7040076k free) CommandLine flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:InitialHeapSize=31457280 -XX:+ManagementServer -XX:MaxHeapSize=104857600 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 2019-11-10T19:19:12.927+0800: 4.575: [GC (Allocation Failure) [PSYoungGen: 8192K->1016K(9216K)] 8192K->1749K(29696K), 0.0024135 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:19:13.097+0800: 4.744: [GC (Allocation Failure) [PSYoungGen: 9208K->1016K(9216K)] 9941K->3080K(29696K), 0.0035051 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:19:13.197+0800: 4.844: [GC (Allocation Failure) [PSYoungGen: 9208K->1000K(9216K)] 11272K->4099K(29696K), 0.0022592 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:19:13.309+0800: 4.957: [GC (Allocation Failure) [PSYoungGen: 9192K->1000K(17408K)] 12291K->5140K(37888K), 0.0049571 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 2019-11-10T19:19:13.476+0800: 5.123: [GC (Allocation Failure) [PSYoungGen: 17384K->1016K(17408K)] 21524K->6996K(37888K), 0.0073199 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2019-11-10T19:19:13.582+0800: 5.230: [GC (Allocation Failure) [PSYoungGen: 17400K->2679K(30720K)] 23380K->8667K(51200K), 0.0042196 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:19:13.759+0800: 5.406: [GC (Allocation Failure) [PSYoungGen: 30327K->3064K(30720K)] 36315K->10745K(51200K), 0.0074231 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2019-11-10T19:19:13.901+0800: 5.548: [GC (Metadata GC Threshold) [PSYoungGen: 27276K->3067K(26624K)] 34956K->12612K(47104K), 0.0034870 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:19:13.905+0800: 5.552: [Full GC (Metadata GC Threshold) [PSYoungGen: 3067K->0K(26624K)] [ParOldGen: 9545K->9589K(22528K)] 12612K->9589K(49152K), [Metaspace: 20548K->20547K(1067008K)], 0.0407167 secs] [Times: user=0.17 sys=0.00, real=0.04 secs]
Java HotSpot(TM) 64-Bit Server VM (25.161-b12) for windows-amd64 JRE (1.8.0_161-b12), built on Dec 19 2017 17:52:25 by "java_re" with MS VC++ 10.0 (VS2010) Memory: 4k page, physical 16687384k(9173344k free), swap 19177752k(7348192k free) CommandLine flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:InitialHeapSize=31457280 -XX:+ManagementServer -XX:MaxHeapSize=104857600 -XX:MaxNewSize=34955264 -XX:MaxTenuringThreshold=6 -XX:OldPLABSize=16 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC 2019-11-10T19:24:18.779+0800: 3.947: [GC (Allocation Failure) 2019-11-10T19:24:18.780+0800: 3.947: [ParNew: 8192K->1024K(9216K), 0.0043711 secs] 8192K->1699K(29696K), 0.0045420 secs] [Times: user=0.05 sys=0.00, real=0.00 secs] 2019-11-10T19:24:18.931+0800: 4.098: [GC (Allocation Failure) 2019-11-10T19:24:18.931+0800: 4.098: [ParNew: 9216K->1024K(9216K), 0.0034687 secs] 9891K->3286K(29696K), 0.0035272 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] ... 2019-11-10T19:24:19.629+0800: 4.797: [GC (CMS Initial Mark) [1 CMS-initial-mark: 7563K(20480K)] 8744K(29696K), 0.0005333 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:24:19.629+0800: 4.797: [CMS-concurrent-mark-start] 2019-11-10T19:24:19.640+0800: 4.808: [CMS-concurrent-mark: 0.011/0.011 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2019-11-10T19:24:19.640+0800: 4.808: [CMS-concurrent-preclean-start] 2019-11-10T19:24:19.641+0800: 4.808: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.03 sys=0.01, real=0.00 secs] 2019-11-10T19:24:19.641+0800: 4.809: [GC (CMS Final Remark) [YG occupancy: 2410 K (9216 K)]2019-11-10T19:24:19.641+0800: 4.809: [Rescan (parallel) , 0.0009765 secs]2019-11-10T19:24:19.642+0800: 4.810: [weak refs processing, 0.0000600 secs]2019-11-10T19:24:19.642+0800: 4.810: [class unloading, 0.0024940 secs]2019-11-10T19:24:19.644+0800: 4.812: [scrub symbol table, 0.0062027 secs]2019-11-10T19:24:19.651+0800: 4.819: [scrub string table, 0.0006104 secs][1 CMS-remark: 7563K(20480K)] 9974K(29696K), 0.0106835 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2019-11-10T19:24:19.652+0800: 4.819: [CMS-concurrent-sweep-start] 2019-11-10T19:24:19.655+0800: 4.823: [CMS-concurrent-sweep: 0.004/0.004 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:24:19.655+0800: 4.823: [CMS-concurrent-reset-start] 2019-11-10T19:24:19.656+0800: 4.824: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Java HotSpot(TM) 64-Bit Server VM (25.161-b12) for windows-amd64 JRE (1.8.0_161-b12), built on Dec 19 2017 17:52:25 by "java_re" with MS VC++ 10.0 (VS2010) Memory: 4k page, physical 16687384k(9167812k free), swap 19177752k(7386372k free) CommandLine flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:InitialHeapSize=31457280 -XX:+ManagementServer -XX:MaxHeapSize=104857600 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation 2019-11-10T19:27:49.318+0800: 4.071: [GC pause (G1 Evacuation Pause) (young), 0.0024797 secs] [Parallel Time: 1.8 ms, GC Workers: 8] [GC Worker Start (ms): Min: 4070.9, Avg: 4070.9, Max: 4070.9, Diff: 0.1] [Ext Root Scanning (ms): Min: 0.2, Avg: 0.4, Max: 0.9, Diff: 0.8, Sum: 3.1] [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Processed Buffers: Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Object Copy (ms): Min: 0.7, Avg: 1.2, Max: 1.4, Diff: 0.6, Sum: 9.5] [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Termination Attempts: Min: 1, Avg: 25.6, Max: 34, Diff: 33, Sum: 205] [GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.5] [GC Worker Total (ms): Min: 1.6, Avg: 1.7, Max: 1.7, Diff: 0.1, Sum: 13.4] [GC Worker End (ms): Min: 4072.6, Avg: 4072.6, Max: 4072.6, Diff: 0.0] [Code Root Fixup: 0.0 ms] [Code Root Purge: 0.0 ms] [Clear CT: 0.2 ms] [Other: 0.5 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.2 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.1 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.0 ms] [Eden: 9216.0K(9216.0K)->0.0B(15.0M) Survivors: 0.0B->2048.0K Heap: 9216.0K(30.0M)->1900.0K(30.0M)] [Times: user=0.00 sys=0.00, real=0.00 secs] ... 2019-11-10T19:27:51.222+0800: 5.974: [GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0038325 secs] [Parallel Time: 2.9 ms, GC Workers: 8] [GC Worker Start (ms): Min: 5974.0, Avg: 5974.0, Max: 5974.3, Diff: 0.4] [Ext Root Scanning (ms): Min: 0.4, Avg: 0.7, Max: 0.9, Diff: 0.5, Sum: 5.3] [Update RS (ms): Min: 0.6, Avg: 0.6, Max: 0.8, Diff: 0.2, Sum: 5.1] [Processed Buffers: Min: 1, Avg: 2.3, Max: 4, Diff: 3, Sum: 18] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Code Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.4, Sum: 0.7] [Object Copy (ms): Min: 1.1, Avg: 1.3, Max: 1.5, Diff: 0.4, Sum: 10.4] [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 8] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] [GC Worker Total (ms): Min: 2.4, Avg: 2.7, Max: 2.8, Diff: 0.4, Sum: 21.7] [GC Worker End (ms): Min: 5976.7, Avg: 5976.7, Max: 5976.7, Diff: 0.0] [Code Root Fixup: 0.0 ms] [Code Root Purge: 0.0 ms] [Clear CT: 0.2 ms] [Other: 0.7 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.5 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.0 ms] [Eden: 9216.0K(9216.0K)->0.0B(7168.0K) Survivors: 2048.0K->2048.0K Heap: 24.2M(30.0M)->17.1M(30.0M)] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:27:51.226+0800: 5.978: [GC concurrent-root-region-scan-start] 2019-11-10T19:27:51.229+0800: 5.981: [GC concurrent-root-region-scan-end, 0.0027122 secs] 2019-11-10T19:27:51.229+0800: 5.981: [GC concurrent-mark-start] 2019-11-10T19:27:51.245+0800: 5.997: [GC concurrent-mark-end, 0.0159182 secs] 2019-11-10T19:27:51.245+0800: 5.997: [GC remark 2019-11-10T19:27:51.245+0800: 5.997: [Finalize Marking, 0.0002420 secs] 2019-11-10T19:27:51.245+0800: 5.997: [GC ref-proc, 0.0002816 secs] 2019-11-10T19:27:51.245+0800: 5.997: [Unloading, 0.0026105 secs], 0.0034068 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:27:51.248+0800: 6.000: [GC cleanup 18M->18M(30M), 0.0007599 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:27:51.304+0800: 6.057: [GC pause (G1 Evacuation Pause) (young), 0.0030225 secs] [Parallel Time: 2.1 ms, GC Workers: 8] [GC Worker Start (ms): Min: 6057.1, Avg: 6057.1, Max: 6057.3, Diff: 0.2] [Ext Root Scanning (ms): Min: 0.1, Avg: 0.3, Max: 0.7, Diff: 0.6, Sum: 2.6] [Update RS (ms): Min: 0.3, Avg: 0.6, Max: 0.9, Diff: 0.6, Sum: 4.7] [Processed Buffers: Min: 1, Avg: 2.5, Max: 5, Diff: 4, Sum: 20] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1] [Object Copy (ms): Min: 0.8, Avg: 1.0, Max: 1.1, Diff: 0.3, Sum: 8.0] [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 8] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] [GC Worker Total (ms): Min: 1.9, Avg: 2.0, Max: 2.0, Diff: 0.2, Sum: 15.7] [GC Worker End (ms): Min: 6059.1, Avg: 6059.1, Max: 6059.1, Diff: 0.0] [Code Root Fixup: 0.0 ms] [Code Root Purge: 0.0 ms] [Clear CT: 0.2 ms] [Other: 0.7 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.5 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.0 ms] [Eden: 7168.0K(7168.0K)->0.0B(1024.0K) Survivors: 2048.0K->2048.0K Heap: 24.1M(30.0M)->18.9M(30.0M)] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:27:51.331+0800: 6.084: [GC pause (G1 Evacuation Pause) (mixed), 0.0038677 secs] [Parallel Time: 3.3 ms, GC Workers: 8] [GC Worker Start (ms): Min: 6084.3, Avg: 6084.5, Max: 6085.0, Diff: 0.6] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.3, Max: 0.7, Diff: 0.7, Sum: 2.7] [Update RS (ms): Min: 0.2, Avg: 1.1, Max: 2.9, Diff: 2.6, Sum: 8.4] [Processed Buffers: Min: 1, Avg: 1.8, Max: 4, Diff: 3, Sum: 14] [Scan RS (ms): Min: 0.0, Avg: 0.3, Max: 1.0, Diff: 1.0, Sum: 2.3] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.2] [Object Copy (ms): Min: 0.1, Avg: 1.2, Max: 1.9, Diff: 1.8, Sum: 9.6] [Termination (ms): Min: 0.0, Avg: 0.3, Max: 0.5, Diff: 0.5, Sum: 2.0] [Termination Attempts: Min: 1, Avg: 8.5, Max: 14, Diff: 13, Sum: 68] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] [GC Worker Total (ms): Min: 2.7, Avg: 3.2, Max: 3.3, Diff: 0.6, Sum: 25.3] [GC Worker End (ms): Min: 6087.6, Avg: 6087.6, Max: 6087.6, Diff: 0.0] [Code Root Fixup: 0.0 ms] [Code Root Purge: 0.0 ms] [Clear CT: 0.1 ms] [Other: 0.4 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.2 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.1 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.0 ms] [Eden: 1024.0K(1024.0K)->0.0B(1024.0K) Survivors: 2048.0K->1024.0K Heap: 19.9M(30.0M)->17.3M(30.0M)] [Times: user=0.00 sys=0.00, real=0.00 secs] 2019-11-10T19:27:51.350+0800: 6.103: [GC pause (G1 Evacuation Pause) (mixed), 0.0032610 secs] [Parallel Time: 2.8 ms, GC Workers: 8] [GC Worker Start (ms): Min: 6102.7, Avg: 6102.7, Max: 6103.1, Diff: 0.4] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.3, Max: 0.6, Diff: 0.6, Sum: 2.4] [Update RS (ms): Min: 0.7, Avg: 1.0, Max: 1.1, Diff: 0.5, Sum: 7.9] [Processed Buffers: Min: 2, Avg: 3.1, Max: 7, Diff: 5, Sum: 25] [Scan RS (ms): Min: 0.3, Avg: 0.4, Max: 0.5, Diff: 0.3, Sum: 3.1] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.2] [Object Copy (ms): Min: 0.7, Avg: 0.9, Max: 1.0, Diff: 0.3, Sum: 7.1] [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Termination Attempts: Min: 1, Avg: 4.1, Max: 7, Diff: 6, Sum: 33] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] [GC Worker Total (ms): Min: 2.2, Avg: 2.6, Max: 2.7, Diff: 0.4, Sum: 20.8] [GC Worker End (ms): Min: 6105.3, Avg: 6105.3, Max: 6105.3, Diff: 0.0] [Code Root Fixup: 0.0 ms] [Code Root Purge: 0.0 ms] [Clear CT: 0.1 ms] [Other: 0.3 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.1 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.1 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.0 ms] [Eden: 1024.0K(1024.0K)->0.0B(1024.0K) Survivors: 1024.0K->1024.0K Heap: 18.3M(30.0M)->15.4M(30.0M)] [Times: user=0.00 sys=0.00, real=0.00 secs]
发生Global Concurrent Marking时机:
jinfo -flag InitiatingHeapOccupancyPercent 1559
根据日志([Eden: 11.0M(11.0M)->0.0B(9216.0K) Survivors: 2048.0K->2048.0K Heap: 24.8M(30.0M)->15.2M(30.0M)]),获得17.1/30.0 > 0.45,因此发生一次全局并发标记。
全局标记完成后,是否发生Mixed GC,取决于G1HeapWastePercent,整个参数默认值是5%。
并发标记完成以后,就能够知道可以回收多少内存,在YCG以后和再次发生Mixed GC以前,会检查垃圾占比是否达到此参数,若是达到了,就会发生Mixed GC。
(1)gceasy
网站
日志文件上传到网站,能够获得GC日志中各类信息项的分析状况,经过图表的方式展现,而且对发生GC的可能性因素都进行了分析。
(2)GCViewer
项目地址
下载项目zip包,解压后,获得一个maven项目,编译后,能够获得可运行jar包--gcviewer-1.36-SNAPSHOT.jar,直接运行便可。
概况图:
右侧3个tab页面,在第一个Summary tab页中,能够获得吞吐量Throughput的值,第三个Pause tab页中,能够获得最大最小停顿时间Min/Max Pause。
上侧3个tab页面,第二个Event details tab页,能够获得什么缘由引发的GC pauses。
根据图中能够得出,采用的是CMS垃圾收集器,YGC发生使应用停顿了84次,CMS Initial Mark停顿了26次,CMS Final remark停顿了4次,每次最大时间、最小时间和平均时间均可以获得。
工具中每一个值表明什么含义,都可以在GCViewer的Github网站找到。
(1)初始设置
(2)Parallel GC调优指导原则
实例:
项目默认启动:
吞吐量 最小停顿时间 最大停顿时间 平均停顿时间 YGC FullGC 96.37% 0.00195s 0.03732s 0.00575s 13 1
得出由于Metadpace致使Full GC。
目前metaspace是20.1M,咱们初步调大到32M,在内存调优时候,咱们须要一个参数一个参数调,这样才能肯定到底时哪一个参数起的做用。
日志分析:
吞吐量 最小停顿时间 最大停顿时间 平均停顿时间 YGC FullGC 96.37% 0.00195s 0.03732s 0.00575s 13 1 ----默认启动 97.69% 0.00172s 0.00538s 0.00352s 13 0 ----Metaspace调大到32M
咱们能够根据日志,以及每一个垃圾收集器的特色,例如这个并行垃圾收集器,咱们就能够试着设置吞吐量和最大停顿时间目标,让垃圾回收期本身动态调整,-XX:MaxGCPauseMillis=100 -XX:GCTimweeRatio=99,而后再经过GCViewer分析GC日志。
(3)G1 GC调优
最佳实践:
调优
默认参数启动:
吞吐量 最小停顿时间 最大停顿时间 平均停顿时间 GC 98.03% 0.00083s 0.01906s 0.00746s 6
设置内存大小,再次测试,-Xms512M -Xmx512M:
吞吐量 最小停顿时间 最大停顿时间 平均停顿时间 GC 98.03% 0.00083s 0.01906s 0.00746s 6 ----默认启动 95.87% 0.00076s 0.01291s 0.00578s 5 -Xms512M -Xmx512M
设置最大停顿时间限制,-XX:MaxGCPauseMillis=100:
吞吐量 最小停顿时间 最大停顿时间 平均停顿时间 GC 98.03% 0.00083s 0.01906s 0.00746s 6 ----默认启动 95.87% 0.00076s 0.01291s 0.00578s 5 -Xms512M -Xmx512M 95.68% 0.00065s 0.00703s 0.00065s 6 -XX:MaxGCPauseMillis=100
此次调整的参数反而致使吞吐量降低和GC次数增长,因此此次参数不该该调整。