测试时使用的jvm版本
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)Java HotSpot(TM) Client VM (build 25.60-b23, mixed mode, sharing)
测试源码
public class TestGC {
static Map<String, String> map = new HashMap<String, String>();
public static void main(String[] args) throws InterruptedException {
Thread.sleep(10000);
int i = 0;
while (true) {
String str = new String(i + "");
Thread.sleep(1);
if (i++ % 1000 == 0) {
map.put(i + "", str);
}
}
}
}
在window系统下打开cmd窗口 输入命令:jstat -gc pid interval
显示内容说明
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
分析:
JVM的GC采用的是分代式垃圾回收,在对象的生命周期内对象的引用可能出现不同区域内,垃圾回收过程中可能将对象移动到不同的区域
1.在EU=EC时表明Eden区域的空间已经不够了,此时触发一次PSYoungGC回收Eden区的垃圾,不能被清除的对象将被转移到survivor区
2.survivor区的对象被转移到Old Space