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中内存回收深入分析,各种垃圾收集器的更多相关文章

  1. JVM虚拟机-垃圾回收机制与垃圾收集器概述

    目录 前言 什么是垃圾回收 垃圾回收的区域 垃圾回收机制 流程 怎么判断对象已经死亡 引用计数法 可达性分析算法 不可达的对象并非一定会回收 关于引用 强引用(StrongReference) 软引用 ...

  2. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  3. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  4. JVM(十),垃圾回收之新生代垃圾收集器

    十.垃圾回收之新生代垃圾收集器 1.JVM的运行模式 2.Serial收集器(复制算法-单线程-Client模式) 2.ParNew收集器(复制算法-多线程-Client模式) 3.Parallel ...

  5. 《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读

    堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要清除的对象, ...

  6. JVM(HotSpot)7种垃圾收集器

    JVM(HotSpot)7种垃圾收集器 7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用. 从JDK1.3到现在,从Serial收集器->Parallel收集器 ...

  7. 3-JVM垃圾回收算法和垃圾收集器

    垃圾回收算法和垃圾收集器 1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象. 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就- ...

  8. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  9. 图解JVM垃圾内存回收算法

    图解JVM垃圾内存回收算法 这篇文章主要介绍了图解JVM垃圾内存回收算法,由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率,下面博主和大家来一起学习一下吧 前言 首先,我们要讲 ...

随机推荐

  1. linux安装总结(亲测)

    一:磁盘分区情况 NTFS,FAT32 这是两种常用的磁盘格式 windows7自带的磁盘工具也可以分出上面的格式,用软件也可以.但是FAT32最大的复制文件进去的限度时4G. EXT3只能用软件才能 ...

  2. HTML简单介绍及常见元素

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Bash函数使用

    #!/bin/bash function Fun_Name() { #function here echo "this is a function" } Fun_Name

  4. Python之路【第十四篇】:AngularJS --暂无内容-待更新

    Python之路[第十四篇]:AngularJS --暂无内容-待更新

  5. Matlab使用xlsread, xlswrite函数导致excel进程无法终止的问题

    系统版本:Win7 64位 Matlab版本:R2015b 问题描述:使用excel的操作函数,比如xlsread,xlswrite,导致excel进程无法终止,任务管理器中仍残留excel进程,打开 ...

  6. plsql 显式游标

    显式游标的处理过程包括: 声明游标,打开游标,检索游标,关闭游标. 声明游标 CURSOR c_cursor_name IS statement; 游标相当于一个查询结果集,将查询的结果放在游标里,方 ...

  7. MVC中javascript直接调用Model

    最近做一个统计页面, Model从后台已经获取了数据集合,想直接在前台展示,而这个展示是需要用js生成图表的. 控制器部分代码: public ActionResult Index() { var m ...

  8. php+支付宝整合

    CREATE TABLE IF NOT EXISTS `alipay_order` ( `id` ) unsigned NOT NULL auto_increment, `orderid` ) NOT ...

  9. JavaScript Window - 浏览器对象模型

    浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话". 浏览器对象模型 (BOM) 浏览器对象模型(Browser Object Model (BOM))尚 ...

  10. EA创建用例图步骤详解

    EA创建用例图步骤详解 1 创建一个项目 2 选择需要的模型 3 新建模型包 4 新建图表 5 新建模型包 6 创建用户角色Actor 7 新建用例 8 关联用户和用例 9 最后整个项目浏览器目录结构 ...