十一、垃圾回收策略配置
在对于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会经历如下几个步骤:
- “CMS-concurrent-mark-start”:CMS标记开始
- “CMS-concurrent-mark”:表示开始进行标记,进入到了STW状态(暂停)
- “CMS-concurrent-preclean-start”:预清理开始
- “CMS-concurrent-sweep-start”:开始进行无用对象清理
CMS执行流程:
CMS的处理适当性会好一些。不过这所有的GC策略都是现在正在常用的策略,都有缺点。实际开发中对于GC策略不建议手工修改,默认的一般比较好用,特殊处理情况除外。
十一、垃圾回收策略配置相关推荐
- JAVA之JVM分代垃圾回收策略(一)
一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...
- java垃圾回收 分代_Java分代垃圾回收策略原理详解
一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...
- JVM分代垃圾回收策略的基础概念
JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...
- ReviewForJob——java虚拟机的垃圾回收策略(个人总结)
理解jvm的垃圾回收策略,需要解决以下3个问题 问题1:哪些内存需要回收? 问题2:什么时候进行回收? 问题3:怎样来回收? [解决问题1]哪些内存需要回收? jvm的内存区域有5大块: 1)程序计数 ...
- 垃圾回收策略和算法,看这篇就够了
作者 | Craig无忌 来源 | 程序员大帝(ID:kingcoding) 前言 回收,旧手机,旧冰箱,旧空调,旧洗衣机,电瓶车摩托车,自行车,报纸,塑料...... 还记得小时候,我喝完的饮料瓶子 ...
- jvm垃圾回收策略之标记清除
垃圾回收指的是对 jvm堆内存的回收. 一. java虚拟机栈 二.本地方法栈(Native Method Stack) 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出Stac ...
- JS 垃圾回收机制以及垃圾回收策略
垃圾回收机制 什么是垃圾回收机制: 解释:执行环境负责管理代码执行过程中使用的内存.JS的垃圾回收机制是为了以防内存泄漏,简单来说就是:间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存. ...
- jvm垃圾回收参数配置
http://hi.baidu.com/mailluzhou/item/98052fdc701baade241f4008 一.相关概念 基本回收算法 引用计数(Reference Counting) ...
- 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略
文章目录 概述 对象已死吗 引用计数算法 可达性分析算法 再谈引用 finalize():生存还是死亡 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot ...
- Redis的超时命令和垃圾回收策略
正如 Java 虚拟机,它提供了自动 GC(垃圾回收)的功能,来保证 Java 程序使用过且不再使用的 Java 对象及时的从内存中释放掉,从而保证内存空间可用. 当程序编写不当或考虑欠缺的时候(比如 ...
最新文章
- 干货!Elasticsearch性能优化实战指南
- SAP UI5 Routing 路由介绍
- 好吧,又是两分钟看完一道投机取巧的算法题
- js赋值与逻辑运算的疑问
- Ansible 起步指南
- OCR测试——字体和背景颜色
- 商务网站建设与维护【5】
- 程序员职业生涯系列:关于技术能力的思考与总结
- 手工焊接电路板经验总结
- groovy_流利的Groovy
- ntp 服务 --Centos
- Android SELinux开发入门指南之如何增加Java Binder Service权限
- java各历史版本官网下载
- htc 手机解锁 unlock bootloader
- Java的Jar文件说明
- reg类型变量综合电路_Verilog - HDL考核试卷一及答案 -
- ubuntu21.04换源
- python金融分析试题_python 金融分析学习
- tomcat的启动start和停止Stop都是灰色的
- android如何修改桌面,安卓手机怎么修改桌面上软件的名字呀!