之前提到了ZGC的一些概念上的东西,真正的运行看一下ZGC的内部运行机制是什么样子的。目前只有在Linux上支持使用ZGC,因此需要有Linux的环境,
Linux安装JDK13
1 下载JDK包
sudo yum install -y curl
curl -O https://download.java.net/java/GA/jdk13/5b8a42f3905b406298b72d750b6919f6/33/GPL/openjdk-13_linux-x64_bin.tar.gz
2 配置JDK环境变量
# 提取,并移动到/opt目录下
tar xvf openjdk-13_linux-x64_bin.tar.gz
sudo mv jdk-13 /opt/
sudo tee /etc/profile.d/jdk13.sh <<EOF
export JAVA_HOME=/opt/jdk-13
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
# 生效JDK的环境配置
source /etc/profile.d/jdk13.sh
# 验证环境是否生效
echo $JAVA_HOME
java -version
使用ZGC
使用JDK13的java运行任何java的文件或者jar包等。JDK12之后可以直接运行文件,无需再编译为class文件。
- 准备一个Java文件
- 或者准备一个jar包。
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx100m -XX:ConcGCThreads=5 -XX:ParallelGCThreads=4 -Xlog:gc* -jar HelloApp.jar
如果想要看到更详细的日志信息:
# 最详细的日志查看方式
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx100m -XX:ConcGCThreads=5 -XX:ParallelGCThreads=4 -Xlog:gc*=debug|trace -jar HelloApp.jar
# 增强堆内存的debug信息
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx100m -XX:ConcGCThreads=5 -XX:ParallelGCThreads=4 -Xlog:gc+heap=debug -jar HelloApp.jar
JVM引用类型
- strong 垃圾收集器不处理的对象
- soft 垃圾收集器可以清理的
- weak 垃圾收集器可以自动清除的对象
- final 垃圾收集器检测到对象已经死掉,执行finalize方法的时候
- Phantom: 垃圾收集器不会自动的移除PhantomReference的对象
- JNI Week Reference: 被JNI接口管理的对象引用
JVM堆空间信息
可以看到在ZGC执行的时候,堆内存当前的状态信息。
JVM的ZGC垃圾收集阶段
- 并发标记
- 暂定标记
- 并发处理,非强引用的对象
- 并发的重新设置relocation
- 并发选择relocation
- 暂停relocate
- 并发重新relocation
最后
GC包含的内容还是比较多,想要探索的,可以再继续深入挖掘
参考:
- [Java GC Tutorials - Herong's Tutorial Examples]([https://books.google.com/books?id=ivmtDwAAQBAJ&pg=PT354&lpg=PT354&dq=zgc+log+format&source=bl&ots=3dyc2Tyh5x&sig=ACfU3U1rhFoEwAeGHDxkKb4YPHUhKLZL2g&hl=en&sa=X&ved=2ahUKEwjI0YylqOjlAhWGGKYKHbCcDO0Q6AEwBnoECAgQAQ#v=onepage&q=zgc%20log%20format&f=false](https://books.google.com/books?id=ivmtDwAAQBAJ&pg=PT354&lpg=PT354&dq=zgc+log+format&source=bl&ots=3dyc2Tyh5x&sig=ACfU3U1rhFoEwAeGHDxkKb4YPHUhKLZL2g&hl=en&sa=X&ved=2ahUKEwjI0YylqOjlAhWGGKYKHbCcDO0Q6AEwBnoECAgQAQ#v=onepage&q=zgc log format&f=false))