JVM中的垃圾回收器及垃圾收集算法描述
首先需要了解下JVM(Java虚拟机)中的内存分配情况:
收集器的介绍:
Serial收集器:是最原始的收集器,是单线程的,实现简单,但是在后台收集垃圾的时候,其他的工作线程都会停止,直到垃圾收集线程执行完毕,给用户的体验就是出现停顿现象,体验差。但是当收集的垃圾少,停顿时间短,次数少,还是可以接受的。运行在Client模式下是一个很好的选择。
ParNew收集器:是Serial收集器的多线程办,不过在单处理器下效果不比Serial收集器效果好,多线程会采取对应的机制,默认开始的线程数量和CPU的数量相同。
CMS收集器:目标是缩短用户的停顿时间,即垃圾收集的时间,是并发收集器,是牺牲吞吐量和新生代空间来换取的。
Parallel Scavenge收集器:目标是达到一个可控的吞吐量(运行用户代码/(运行用户代码+垃圾收集时间)),被称为吞吐量优先的收集器。采用复制算法实现
算法:
引用计数法:在对象中添加一个基数器,当有变量引用这个对象时,计数器就加一,当变量放开对这个对象的引用时,计数器就减一,当计数器的值为0时,表示没有引用这个对象的变量了,后续就可以被垃圾收集器处理了。
优缺点:实现简单,但针对互相引用的对象没办法进行清理。如: objA.instance=objB;objB.instance=objA;这种情况下,其他变量引用这2个对象了,但是这两个 对象仍然不能删除,因为它们互相引用,计数器的值不为0.
可达性分析:以GC Roots为起点,从这些节点开始,向下搜索形成引用链,当GC Roots到某个对象为不可达时,表示这个对象就是一个无用的对象,可以在垃圾收集时进行处理。
标记-清处算法:进行2个过程,标记:把需要清理的对象都标记出来;清除:就是把标记的对象都清楚掉。这2个过程效率都不是很高,且会产生很多空间碎片,导致因为大对象没有连续的内存分配空间而引起再次的垃圾回收。
复制算法:标记-清除算法中存在效率和空间碎片问题,此复制算法可以解决效率问题,把内存空间分为等同大小的块,使用其中的一块进程分配,当内存用完时,把还存活的对象放到另一个内存中,然后把原理内存块一起清理掉,新块中根据指针按需分配排列。实现简单,效率好,但是会浪费一般的内存。
标记整理算法:此算法也是分为2步,第一步标记,第二步整理,标记和前面讲的标记一样,仅是第二步整理,是把存活的对象往一个方向移动,然后清除掉边缘部分。此种算法没有空间碎片的存在了。
分代收集算法:没有采用新的算法,而是根据对象的存活时间不同,把内存分为新生代和老年代,且由于新生代多为新创建的对象,需要的内存空间大,比例按照8:1:1进行划分内存的。然后根据区域的不同采用不同的收集算法,新生代的对象存活率低,可以使用复制算法,老年代的对象存活率高,可以采用标记清除或者标记整理算法。
GC日志:
GC的日志格式就是时间+类型+内存数据等信息的构成
在日志结果中,可以观察到,使用的收集器是Parallel Scavenge收集器-> PSYoungGen,ps是缩写,默认的Default New Generation的是新生代是使用Serial收集器。名字与收集器有关。使用时根据具体的情况进行实例对象的分配,比如新生代中的Eden区内存不够时,接下来大的实例化对象存到survivor中也不够,则就会直接存储到老年区。
而使用Serial收集器时,先分配6M的新生代区域,后面的4M不够分配,会发生minor GC,在GC期间,6M的空间不足以分配到survivor区域(这个区域仅1M),所以会通过担保机制把6M的对象直接放入到老年区。使用的收集器不同得出的垃圾回收日志会不相同。
Minor GC:是指新生代的垃圾回收,一般java对象的生命周期都很短,minor GC频繁,回收也快。
Full GC:指老年代的回收,经常会伴随一次minor GC,但不是绝对的,Parallel Scavenge就可以直接Major GC,速度一般比minor GC 慢10倍以上。
测试代码如下所示:
package com.class01; /**
* @Author: guopengxia
* @Date: 2019/3/22 19:09
* @Version: 1.0
*/
public class Class01 {
private static final int _1MB=1024*1024;
/**
* 设置VM的参数:
* -Xms20M -Xmx20M -Xmn10M //Xms,Xmx设置堆内存的大小(20M) Xmn:设置年轻代大小
* -XX:PrintGCDetails //设置打印GC的详细信息(收集器日志参数)
* -XX:SurvivorRatio=8 //设置老年区的比例信息,新生区Eden:其中一个Survivor的比例为8:1
*/ public static void testAllocation(){
byte [] allocation1,allocation2,allocation3,allocation4;
allocation1=new byte[2*_1MB];
allocation2=new byte[2*_1MB];
allocation3=new byte[2*_1MB];
allocation4=new byte[4*_1MB]; //此处会出现一次Minor GC(当新生代没有内存进行分配时,会出现Minor GC)
} public static void main(String []args){
Class01.testAllocation();
}
}
下面是日志截图,这次是日志显示到控制台(可以把GC的信息打印到日志文件中,进行参数设置即可)

JVM中的垃圾回收器及垃圾收集算法描述的更多相关文章
- jvm中的垃圾回收器
HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用.Serial(串行GC)收集器 Serial收集器 ...
- JVM学习--(五)垃圾回收器
上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃 ...
- JVM有哪些垃圾回收器
JVM 的垃圾回收器 目录 JVM 的垃圾回收器 经典垃圾收集器 Serial 收集器 ParNew 收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel ...
- JVM学习——G1垃圾回收器(学习过程)
JVM学习--G1垃圾回收器 把这个跨时代的垃圾回收器的笔记独立出来. 新生代:适用复制算法 老年代:适用标记清除.标记整理算法 二娃本来看G1的时候觉得比较枯燥,但是后来总结完之后告诉我说,一定要慢 ...
- 浅谈jvm中的垃圾回收策略
下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已 ...
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
- 说一下 jvm 有哪些垃圾回收器?
新生代收集器: SerialParNewParallel Scavenge 老年代收集器: Serial OldCMSParallel Old 堆内存垃圾收集器: G1 参考链接:JVM常见的垃圾回收 ...
- JVM几种垃圾回收器介绍
整理自:http://www.cnblogs.com/lspz/p/6397649.html 一.如何回收? 1.1 垃圾收集算法: (1)标记-清除(Mark-Sweep)算法 这是最基础的算法,就 ...
- JVM 中的垃圾回收
说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收 ...
随机推荐
- docker enable overlay2 quota on Centos 7
参考文档 docker overlay2的 --storage-opt 需要启动mount 参数中有pquota 参考上边的文档mount中的xfs 含有pquota 将 /etc/fstab 文件中 ...
- Node.js基础学习三之登录功能
本篇介绍Node.js访问数据库并返回数据给客户端 需求基于Node.js学习(二) 数据库请下载:user.sql 1.创建user 实体类(model-user.js) function User ...
- cent OS 7查询IP
环境: win7旗舰版 VMware Workstation Pro (虚拟机软件) CentOS-7-x86_64-DVD-1804.iso 安装时选择了默认配置,最小系统安装. 安装好后用 if ...
- Chrome VSCode常用快捷键
MAC下快捷键 Chrome快捷键: 关闭标签页:Cmd + w 新建标签页:Cmd + t 切换到指定标签页:Cmd + 数字 正向切换标签页: Ctrl + Tab 反向切换标签页: Ctrl + ...
- Java中的抽象
什么是抽象类? 如果一个类没有足够的信息去描述一个具体的对象,那么这样的类我们就称它为抽象类.这很好理解,就如同动物是一个很广泛的概念,由于在动物这个类里,我们无法用很详细的信息去描述狗狗这个具体的对 ...
- 单体 VS 微服务
看图说话 群里发来一张图, 形象TM又生动: 异同之处 借此对比说说单体和微服务的异同之处: 一大坨的时候, 难泄, 具体表现为, 牵一发而动全身, 时而久之, 便秘/肠道不适/影响代谢/肤色变差/身 ...
- 【转】java线上程序排错经验2 - 线程堆栈分析
前言 在线上的程序中,我们可能经常会碰到程序卡死或者执行很慢的情况,这时候我们希望知道是代码哪里的问题,我们或许迫切希望得到代码运行到哪里了,是哪一步很慢,是否是进入了死循环,或者是否哪一段代码有问题 ...
- linux服务基础(二)之httpd2.2基础配置
一.安装httpd服务 CentOS6 默认安装httpd2.2版本 CentOS7 默认安装httpd2.4版本 # yum install httpd 二.安装后相关文件说明 配置文件: /etc ...
- ASP.NET MVC WebAPI Put和Delete请求出现405(Method not allowed)错误
解决办法: 在站点根目录下的web.config设置如下(主要参考添加项): <system.webServer> <modules> <remove name=&quo ...
- _trigger
-- 触发器设置-- 使用说明:-- 1.脚本名为TriggerScript,使用时添加该生物即可-- 2.可以控制玩家进入附近时是上马.下马.或者提示信息.