一 概述
GC(Garbage Collection),在程序運行過程中內存空間是有限的,爲了更好的的使用有限的內存空間,GC會將不再使用的對象清除然後將其所佔用的內存釋放出來。
觸發GC的條件:
1. 程序調用System.gc的時候觸發GC。
/**
* Runs the garbage collector.
* <p>
* Calling the <code>gc</code> method suggests that the Java Virtual
* Machine expend effort toward recycling unused objects in order to
* make the memory they currently occupy available for quick reuse.
* When control returns from the method call, the Java Virtual
* Machine has made a best effort to reclaim space from all discarded
* objects.
* <p>
* The call <code>System.gc()</code> is effectively equivalent to the
* call:
* <blockquote><pre>
* Runtime.getRuntime().gc()
* </pre></blockquote>
*
* @see java.lang.Runtime#gc()
*/
public static void gc() {
Runtime.getRuntime().gc();
}
2. 系統自身決定GC的觸發時機,主要根據Eden區和From Space區的內存大小來決定,當內存大小不足時,則會啓動GC線程(Daemon線程)並停止應用線程。
二 查看Java8的默認GC
1. cmd命令行查看Java8的GC:
java -XX:+PrintCommandLineFlags -version
結果如下:
-XX:InitialHeapSize=132397312 // JVM默認初始化堆大小
-XX:MaxHeapSize=2118356992 //JVM堆的默認最大值
-XX:+PrintCommandLineFlags
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC //Java8使用的GC類型
java version "1.8.0_20" //使用的java版本
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
結果分析:由結果可以看出Java8的GC情況是:-XX:+UseParallelGC,即Parallel Scavenge(新生代) + Parallel Old(老生代),實際上幾個主流Java版本的GC情況如下:
- jdk1.7 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
- jdk1.8 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
- jdk1.9 默認垃圾收集器G1
2. cmd命令行查看Java8的GC詳細情況:
java -XX:+PrintGCDetails -version
結果如下:
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
Heap
PSYoungGen total 38400K, used 2678K [0x00000000d5e00000, 0x00000000d8880000, 0x0000000100000000)
eden space 33280K, 8% used [0x00000000d5e00000,0x00000000d609dbc0,0x00000000d7e80000)
from space 5120K, 0% used [0x00000000d8380000,0x00000000d8380000,0x00000000d8880000)
to space 5120K, 0% used [0x00000000d7e80000,0x00000000d7e80000,0x00000000d8380000)
ParOldGen total 87552K, used 0K [0x0000000081a00000, 0x0000000086f80000, 0x00000000d5e00000)
object space 87552K, 0% used [0x0000000081a00000,0x0000000081a00000,0x0000000086f80000)
Metaspace used 2257K, capacity 4480K, committed 4480K, reserved 1056768K
class space used 244K, capacity 384K, committed 384K, reserved 1048576K
在Java中使用Metaspace(元空間)而移除了PermGenspace(永久區)。也就意味着這部分內存空間將全部移除。設置JVM的參數PermSize和MaxPermSize時會被忽略並給出警告。但是類的元素據信息(metadata)還在,只是不再是存儲在連續的堆空間中,而是移動到了被稱爲"Metaspace(元空間)"的本地內存(Native memory)中。
補充JDK1.6,JDK1.7與JDK1.9的信息:
JDK1.6
-XX:InitialHeapSize=132397312
-XX:MaxHeapSize=2118356992
-XX:ParallelGCThreads=4
-XX:+PrintCommandLineFlags
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC
java version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)
java version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)
Heap
PSYoungGen total 37696K, used 646K [0x00000007d5e00000, 0x00000007d8810000, 0x0000000800000000)
eden space 32320K, 2% used [0x00000007d5e00000,0x00000007d5ea19a8,0x00000007d7d90000)
from space 5376K, 0% used [0x00000007d82d0000,0x00000007d82d0000,0x00000007d8810000)
to space 5376K, 0% used [0x00000007d7d90000,0x00000007d7d90000,0x00000007d82d0000)
PSOldGen total 86272K, used 0K [0x0000000781a00000, 0x0000000786e40000, 0x00000007d5e00000)
object space 86272K, 0% used [0x0000000781a00000,0x0000000781a00000,0x0000000786e40000)
PSPermGen total 21248K, used 2709K [0x000000077c800000, 0x000000077dcc0000, 0x0000000781a00000)
object space 21248K, 12% used [0x000000077c800000,0x000000077caa5738,0x000000077dcc0000)
JDK1.7
-XX:InitialHeapSize=132397312
-XX:MaxHeapSize=2118356992
-XX:+PrintCommandLineFlags
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
//1.7中的PSPermGen永久代到1.8中是Metaspace
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
Heap
PSYoungGen total 38400K, used 1997K [0x00000007d5e00000, 0x00000007d8880000, 0x0000000800000000)
eden space 33280K, 6% used [0x00000007d5e00000,0x00000007d5ff3480,0x00000007d7e80000)
from space 5120K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d8880000)
to space 5120K, 0% used [0x00000007d7e80000,0x00000007d7e80000,0x00000007d8380000)
ParOldGen total 86016K, used 0K [0x0000000781a00000, 0x0000000786e00000, 0x00000007d5e00000)
object space 86016K, 0% used [0x0000000781a00000,0x0000000781a00000,0x0000000786e00000)
PSPermGen total 21504K, used 2222K [0x000000077c800000, 0x000000077dd00000, 0x0000000781a00000)
object space 21504K, 10% used [0x000000077c800000,0x000000077ca2b8c0,0x000000077dd00000)
JDK1.9
-XX:G1ConcRefinementThreads=4
-XX:InitialHeapSize=132397312
-XX:MaxHeapSize=2118356992
-XX:+PrintCommandLineFlags
-XX:ReservedCodeCacheSize=251658240
-XX:+SegmentedCodeCache
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseG1GC
-XX:-UseLargePagesIndividualAllocation
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
C:\Users\pengu>java -Xlog:Gc* -version
[0.015s][info][gc,heap] Heap region size: 1M
[0.021s][info][gc ] Using G1
[0.021s][info][gc,heap,coops] Heap address: 0x0000000081a00000, size: 2022 MB, Compressed Oops mode: 32-bit
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
[0.123s][info][gc,heap,exit ] Heap
[0.124s][info][gc,heap,exit ] garbage-first heap total 131072K, used 1024K [0x0000000081a00000, 0x0000000081b00400, 0x0000000100000000)
[0.124s][info][gc,heap,exit ] region size 1024K, 2 young (2048K), 0 survivors (0K)
[0.125s][info][gc,heap,exit ] Metaspace used 3453K, capacity 4480K, committed 4480K, reserved 1056768K
[0.126s][info][gc,heap,exit ] class space used 352K, capacity 384K, committed 384K, reserved 1048576Kjava