在对于JVM而言,本身有两种运行模式:单机版客户端程序(client)、服务端程序(server)。

常用GC策略

GC策略调整参数

收集器参数设置


如果要想确认使用的GC处理,首先需要知道当前主机上可以支持的处理进程数量。

范例

范例1:取得可用的进程数量

Runtime.getRuntime().availableProcessors();

范例2:观察使用的默认GC模式

public class TestGCDemo {public static void main(String[] args) {java.util.Random rand=new java.util.Random();String str="hello world";while(true){str+=str+rand.nextInt(999999);str.intern();//入池 ,强制性垃圾产生}}
}

运行参数设置 -Xmx10m -Xms10m -XX:+PrintGCDetails


输出结果中会有如下几个信息显示:

[Full GC (Allocation Failure)[PSYoungGen: 0K->0K(2048K)][ParOldGen: 4564K->4544K(7168K)] 4564K->4544K(9216K),[Metaspace: 3519K->3519K(1056768K)], 0.0149522 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]

可以看到默认状态下年轻代使用的是并行回收GC(ParallelScavenge)来进行垃圾释放。

而老年代的回收默认使用的是“ParOldGen”,采用的是并行GC(Parallel MSC)完成的老年代处理。

上面只是基于我的电脑的默认策略,虚拟机会根据当前电脑的情况,来选择合适的GC处理策略。因此,大部分而言,没有必要调整处理策略。

范例3:使用串行GC

还是使用范例2的代码,运行参数配置:

-Xmx10m -Xms10m -XX:+PrintGCDetails -XX:+UseSerialGC

运行输出结果

[GC (Allocation Failure)[DefNew: 2752K->320K(3072K), 0.0060972 secs] 2752K->1223K(9920K), 0.0062006 secs][Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Allocation Failure)[Tenured: 4839K->4559K(6848K), 0.0075186 secs] 4839K->4559K(9920K),
[Metaspace: 3518K->3518K(1056768K)], 0.0075650 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

范例4:使用并行GC

还是使用范例2的代码,运行参数配置:

-Xmx10m -Xms10m -XX:+PrintGCDetails -XX:+UseParNewGC

运行输出结果

[GC (Allocation Failure)[ParNew (promotion failed): 2175K->2175K(3072K), 0.0005994 secs][Tenured: 5948K->4860K(6848K), 0.0058181 secs] 5948K->4860K(9920K), [Metaspace: 3521K->3521K(1056768K)], 0.0064770 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Allocation Failure)[Tenured: 4860K->4555K(6848K), 0.0054815 secs] 4860K->4555K(9920K), [Metaspace: 3521K->3521K(1056768K)], 0.0055406 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

还有一个警告

Java HotSpot(TM) 64-Bit Server VM warning: Using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release

不建议使用了

范例5:使用CMS处理

GC策略调整参数

从上图中可以看到CMS只对老年代的并行GC有效。

代码还是使用范例2的代码,运行参数配置:

-Xmx10m -Xms10m -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC

运行结果

[GC (CMS Initial Mark)[1 CMS-initial-mark: 53960K(102400K)] 88784K(148480K), 0.0002741 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-mark-start][CMS-concurrent-mark: 0.006/0.049 secs][Times: user=0.19 sys=0.03, real=0.05 secs]
[CMS-concurrent-preclean-start][CMS-concurrent-preclean: 0.000/0.000 secs][Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-abortable-preclean-start][CMS-concurrent-abortable-preclean: 0.000/0.000 secs][Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-sweep-start][CMS-concurrent-sweep: 0.001/0.001 secs][Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-reset-start][CMS-concurrent-reset: 0.000/0.000 secs][Times: user=0.00 sys=0.00, real=0.00 secs]

通过输出结果,可以看到CMS会经历如下几个步骤:

  1. “CMS-concurrent-mark-start”:CMS标记开始
  2. “CMS-concurrent-mark”:表示开始进行标记,进入到了STW状态(暂停)
  3. “CMS-concurrent-preclean-start”:预清理开始
  4. “CMS-concurrent-sweep-start”:开始进行无用对象清理

CMS执行流程:

CMS的处理适当性会好一些。不过这所有的GC策略都是现在正在常用的策略,都有缺点。实际开发中对于GC策略不建议手工修改,默认的一般比较好用,特殊处理情况除外。

十一、垃圾回收策略配置相关推荐

  1. JAVA之JVM分代垃圾回收策略(一)

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  2. java垃圾回收 分代_Java分代垃圾回收策略原理详解

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  3. JVM分代垃圾回收策略的基础概念

    JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...

  4. ReviewForJob——java虚拟机的垃圾回收策略(个人总结)

    理解jvm的垃圾回收策略,需要解决以下3个问题 问题1:哪些内存需要回收? 问题2:什么时候进行回收? 问题3:怎样来回收? [解决问题1]哪些内存需要回收? jvm的内存区域有5大块: 1)程序计数 ...

  5. 垃圾回收策略和算法,看这篇就够了

    作者 | Craig无忌 来源 | 程序员大帝(ID:kingcoding) 前言 回收,旧手机,旧冰箱,旧空调,旧洗衣机,电瓶车摩托车,自行车,报纸,塑料...... 还记得小时候,我喝完的饮料瓶子 ...

  6. jvm垃圾回收策略之标记清除

    垃圾回收指的是对 jvm堆内存的回收. 一. java虚拟机栈 二.本地方法栈(Native Method Stack) 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出Stac ...

  7. JS 垃圾回收机制以及垃圾回收策略

    垃圾回收机制 什么是垃圾回收机制: 解释:执行环境负责管理代码执行过程中使用的内存.JS的垃圾回收机制是为了以防内存泄漏,简单来说就是:间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存. ...

  8. jvm垃圾回收参数配置

    http://hi.baidu.com/mailluzhou/item/98052fdc701baade241f4008 一.相关概念 基本回收算法 引用计数(Reference Counting) ...

  9. 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略

    文章目录 概述 对象已死吗 引用计数算法 可达性分析算法 再谈引用 finalize():生存还是死亡 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot ...

  10. Redis的超时命令和垃圾回收策略

    正如 Java 虚拟机,它提供了自动 GC(垃圾回收)的功能,来保证 Java 程序使用过且不再使用的 Java 对象及时的从内存中释放掉,从而保证内存空间可用. 当程序编写不当或考虑欠缺的时候(比如 ...

最新文章

  1. 干货!Elasticsearch性能优化实战指南
  2. SAP UI5 Routing 路由介绍
  3. 好吧,又是两分钟看完一道投机取巧的算法题
  4. js赋值与逻辑运算的疑问
  5. Ansible 起步指南
  6. OCR测试——字体和背景颜色
  7. 商务网站建设与维护【5】
  8. 程序员职业生涯系列:关于技术能力的思考与总结
  9. 手工焊接电路板经验总结
  10. groovy_流利的Groovy
  11. ntp 服务 --Centos
  12. Android SELinux开发入门指南之如何增加Java Binder Service权限
  13. java各历史版本官网下载
  14. htc 手机解锁 unlock bootloader
  15. Java的Jar文件说明
  16. reg类型变量综合电路_Verilog - HDL考核试卷一及答案 -
  17. ubuntu21.04换源
  18. python金融分析试题_python 金融分析学习
  19. tomcat的启动start和停止Stop都是灰色的
  20. android如何修改桌面,安卓手机怎么修改桌面上软件的名字呀!

热门文章

  1. C# 网页自动填表自动登录 .
  2. 数据结构之红黑树插入案例详解
  3. Spring Cloud Alibaba Sentinel之入门篇
  4. JVM初识之内存分析常用命令和工具
  5. ASCII、Unicode、UTF、base64
  6. CentOS 挂载数据盘
  7. 虚拟机 linux 设置IP 常用命令
  8. OneAlert 入门(三)——事件分析
  9. mac安装xdebug
  10. multiple多图选择,借助FormData通过ajax实现上传