一、java查看垃圾收集器
使用命令:java -XX:+PrintCommandLineFlags -version。如下:
image.png
可以看到这台机器上,安装的java版本,默认的垃圾收集器是-XX:+UseParallelGC。
二、jvm查看垃圾收集器
使用命令:jmap -heap pid。pid通过jps可以查看,如下:
image.png
老年代使用的是CMS收集器。和上面通过java命令查看得到的UseParallelGC(Parallel Scavenge+Parallel Old)不一样。
这是为啥?
因为java命令查看的是本机安装的java版本自带的默认垃圾收集器。而JVM是启动起来的具体进程,可以指定具体使用哪种收集器。比如:同一台机器上安装java1.8版本,默认是UseParallelGC,但是我可以在本机起来两个JVM,分别指定不同的垃圾收集器。所以这就是一直困惑我的问题:通过java命令查看的垃圾收集器和机器上gc日志打印出来的垃圾收集器,不一样。原来是我把java垃圾收集器当成了jvm垃圾收集器,它们两还是不一样的。一个是静态的,一个是动态的。JVM启动的时候,可以设置启动参数,修改垃圾收集器。如下:
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly"
总结:网上搜索到的,很多都是查看java的垃圾收集器。这里要区分JVM和java的不同。
image.png
网友评论