JVM中内存回收深入分析,各种垃圾收集器
JVM启动有两种模式,client和server
一般JVM启动时会根据主机情况分析选择采用那种模式启动
可发现是server模式
JVM中尤其需要关注的就是HEAP堆区
堆区分为新生代和老年代
新生代分为eden,s0,s1
老年代就Old
什么时候出发垃圾回收呢?
当新对象在eden区分配失败时就会触发一次YGC,即新生代的垃圾回收,eden区中的存活对象进入s0,s0若放不下,进入OLD,再扫描S1区,存活次数超过阀值的进入OLD,否则进入S0,之后,s0和s1交换。
当老年代放不下时就出发FGC。
内存的回收策略有
串行/并行
串行即单线程负责垃圾回收,不适合多CPU,耗时长
并行即多线程垃圾回收,适合多CPU,效率高
stop the world/并发
stop the world,JVM里的应用线程会挂起,只有垃圾回收线程在运行,回收的干净,因为没有任何应用线程在垃圾回收时再次产生垃圾
并发,垃圾回收时,应用线程也在运行,回收不干净,因为应用线程在垃圾回收时也可能产生新的垃圾
压缩/非压缩
垃圾回收后清理碎片,压缩空间
新生代串行垃圾收集器
采用stop the world的策略
老年代串行垃圾收集器
MARK-->标记存活对象,SWEEP-->回收垃圾,COMPACT-->压缩空间碎片
jmap -heap pid查看堆区使用情况
jstat -gcutil pid time查看各个区的实时使用情况
可以清楚的看到YGC的发生情况
收集算法是内存回收的方法论,收集器是内存回收的具体实现,主要的收集器有如下几种:
serial收集器:
复制收集算法,在垃圾回收时,必须暂停其它的所用应用线程,回收策略为stop the world,单线程的,serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择,简单而高效,对于单个CPU的环境,没有线程交互的开销,专心垃圾回收,而且一般桌面应用中新生代也不会很大,回收暂停时间很短。针对新生代的收集器。
ParNew收集器:
是serial收集器的多线程版本,其它与serial收集器完全一样。是运行在server模式下首选新生代收集器,有一个很重要的原因是,除了serial收集器,目前只有它能与CMS收集器配合工作。
-XX:+UseConcMarkSweepGC设置老年代为并发收集,-XX:UseParNewGC设置年轻代为并发收集
Parallel Scavenge收集器:
新生代收集器,采用复制算法,可控制垃圾回收暂停时间以及吞吐量大小,-XX:MaxGCPauseMillis(毫秒),-XX:GCTimeRatio,它是 以吞吐量最大化(即GC时间占总运行时间最小)为目标的收集器实现,它允许较长时间的STW(stop the world)换取总吞吐量最大化。
Serial Old收集器:
标记整理算法,是Serial收集器的老年代版本
Parallel Old收集器:
Parallel Scavenge收集器的老年代版本,标记整理算法
CMS收集器:
是一种以获取最短回收停顿时间为目标的收集器,标记清除算法,
初始标记-->并发标记-->重新标记-->并发清除
其中初始标记和重新标记仍然会发生stop the world,初始标记是标记一下GC ROOTS能直接关联到的对象,速度很快,并发标记就是GC ROOTS TRACING的过程,而重新标记是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象标记记录。
整个过程中,耗时最长的并发标记和并发清除可以与应用线程并发进行。
G1收集器:
标记整理算法,不会产生碎片,会整理碎片,空间连续,
该图是hotspot JVM 1.6的垃圾收集器选择的配合使用情况。
上图是老年代的一次GC。
JVM中内存回收深入分析,各种垃圾收集器的更多相关文章
- JVM虚拟机-垃圾回收机制与垃圾收集器概述
目录 前言 什么是垃圾回收 垃圾回收的区域 垃圾回收机制 流程 怎么判断对象已经死亡 引用计数法 可达性分析算法 不可达的对象并非一定会回收 关于引用 强引用(StrongReference) 软引用 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
- JVM(十),垃圾回收之新生代垃圾收集器
十.垃圾回收之新生代垃圾收集器 1.JVM的运行模式 2.Serial收集器(复制算法-单线程-Client模式) 2.ParNew收集器(复制算法-多线程-Client模式) 3.Parallel ...
- 《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要清除的对象, ...
- JVM(HotSpot)7种垃圾收集器
JVM(HotSpot)7种垃圾收集器 7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用. 从JDK1.3到现在,从Serial收集器->Parallel收集器 ...
- 3-JVM垃圾回收算法和垃圾收集器
垃圾回收算法和垃圾收集器 1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象. 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就- ...
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
- 图解JVM垃圾内存回收算法
图解JVM垃圾内存回收算法 这篇文章主要介绍了图解JVM垃圾内存回收算法,由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率,下面博主和大家来一起学习一下吧 前言 首先,我们要讲 ...
随机推荐
- CentOS iSCSI客户端使用配置
配置步骤: 1.查看安装是否安装iSCSI驱动 rpm -qa|grep iscsi 2.查看yum安装源 yum list |grep iscsi 3.安装iscsi驱动 yum install i ...
- MySQL(10):实体、实体表和外键(foreign key)
1.实体 数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表.视图.存储过程等都是数据库实体.广义上讲,这些对象中所存储的数据也是数据库实体.因为它们也是确切存 ...
- centos 6 搭建ftp服务器支持匿名读写
转载请注明: 凌云物网智科嵌入式实验室: http://iot-yun.com/ 郭文学<guowenxue@gmail.com> vsftpd在运行时一定要关闭SELinux,否 ...
- oracle备份表
oracle与sql单表备份的区别 ( oracle中备份表: create table 备份表名 as select * from 原表 sql server中备份表: select * i ...
- linux 脚本编写基础(一)
1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在 ...
- iOS-NSSDate的使用
取当前时间的秒数 NSTimeInterval time = [[NSDate date] timeIntervalSince1970];long long int date = (long long ...
- JAVA 环境变量
Java是由Sun公司开发的一种应用于分布式网络环境的程序设计语言,Java语言拥有跨平台的特性,它编译的程序能够运行在多种操作系统平台上,可以实现“一次编写,到处运行”的强大功能. 工具/原料 JD ...
- Java----多线程知识点归纳(概念)
一.线程与进程的区别: 多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响. ?线程本身的数据通常只有寄存器数据,以及一个 程序执行时使用的堆栈,所以线程 ...
- 【转】WF4.0 (基础篇)
转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter —— 兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...
- ROW_NUMBER分页的注意事项
之前在使用ROW_NUMBER分页获取数据的时候,直接用ROW_NUMBER里的SELECT语句查出了所有的数据. like this: select * from ( select row_numb ...