JVM—垃圾回收器
- 串行
- 单线程
- 适合堆内存较小的个人电脑
- 吞吐量优先
- 多线程
- 堆内存较大,多核CPU
- 让单位时间内,stw的时间最短,回收每次回收事件长一点过,次数少一点
- 响应时间优先
- 多线程
- 堆内存大,多核CPU
- 尽可能让单次stw时间最短,回收次数多
串行垃圾回收器:
JVM参数: -XX:+UseSerialGC = Serial + SerialOld
某个线程A所需要的内存不够时,全部的线程都保存到某个安全点(SWT),然后线程A去执行垃圾回收操作.
吞吐量优先垃圾回收器:
JVM参数: -XX:+UseParallelGC ; -XX:+UseParallelOldGC
当某个线程内存不够时,全部线程保存某个安全点后,全不线程都去执行垃圾回收操作,尽可能多的回收内存.(吞吐量优先的垃圾回收器,默认情况下执行垃圾回收时CPU的占用率会达到100%)
其他参数:
-XX:+UseAdaptiveSizePolicy 自适应调Eden区和Survivor区的比例
-XX:+GCTimeRatio=tario 设置GC时间与程序运行总时间的占比
-XX:MaxGCPauseMillis=200ms 设置一次STW的的最大时间为200ms(默认值就是200ms)
响应时间优先(CMS):
JVM参数:-XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QrVXANzo-1633872976929)(C:\Users\MMCC\AppData\Roaming\Typora\typora-user-images\1633871556860.png)]
如图: 老年代内存不足时进行垃圾回收,首先STW,由某个线程A进行垃圾初始标记(标记一些根),然后其他线程可以恢复运行,该线程A继续将垃圾标记剩下的垃圾,完成之后,由于并发标记的过程中用户线程可能还会产生垃圾,或者将某些引用进行了更改,所以需要再进行一次STW,全部的线程都进行垃圾标记.最后由线程A进行垃圾清理,其他线程正常运行.
其他参数:
-XX:ParallelGCThreads=n 并行的垃圾回收线程数量,并行就是全部线程进行垃圾回收,
-XX:ConcGCThreads=threads 并发垃圾回收线程数量,一般取线程数量的1/4,如上图只有一个线程为垃圾回收线程
eads 并发垃圾回收线程数量,一般取线程数量的1/4,如上图只有一个线程为垃圾回收线程`
-XX:CMSInitiatingOccupancyFraction=percent 当内存占用达到percent(默认值为80)时就要进行垃圾回收(注意不能时是内存占满了才进行),CMS在并发清理过程有用户线程在运行,用户线程便会产生新的垃圾,如果内存被占满了才进行垃圾回收,新产生的垃圾就没有空间存储(也可以说是用户线程所需要的运行的内存空间不够)