Java虚拟机的内存管理----垃圾收集器

1.Serial收集器

优点,是简单而高效,单线程避免了线程交互的开销.

缺点,进行垃圾回收时需要Stop the world(暂停所有用户线程).

2.ParNew收集器

它是Serial收集器的多线程版本,新生代才有多线程并行收集.是CMS收集器(下文会介绍)的默认新生代收集器.

ParNew在单CPU的情况下,会比Serial收集器效率更差,因为多线程交互的开销.

但是,如今的计算机普遍是多CPU多核,而ParNew默认的线程数量是CPU的数量.因此它更加适应潮流.

3.Parallel Scavenge收集器

它是一个追求吞吐量的收集器.

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

可以通过-XX:GCTimeRatio参数来设置希望达到的吞吐量.

Parallel Scavenge收集器会根据实际运行情况,自适应调整新生代Eden:Survivor的比例,意在达到目标吞吐量.

4.Serial Old收集器

它是Serial收集器的老年代版本,使用标记整理算法.主要意义在于给Client模式下的虚拟机使用.

Server模式下,在JDK1.5和以前的版本配合Parallel Scavenge收集器搭配使用.

另外,Serial Old收集器也是CMS收集器的预备方法,当出现Concurrent Mode Failure时使用.

5.Parallel Old收集器

它是Parallel Scavenge收集器的老年代收集器,使用多线程标记整理算法.

6.CMS(Concurrent Mark Sweep)

它追求的是低停顿时间,适合注重服务响应速度的场景,比如互联网网站B/S系统的Server端上.

CMS是基于标记清除算法的,分成4个步骤:

1.初始标记(CMS Initial Mark)

需要暂停用户线程,标记Root能直接关联到的对象,速度很快耗时很短.

2.并发标记(CMS Concurrent Mark)

无需暂停用户线程,进行Root Tracing的过程

3.重新标记(CMS Remark)

需要暂停用户线程,为了修正并发标记期间因为用户线程继续运行而产生标记变动的那一部分对象的标记记录.

这个阶段的停顿时间一般会比初始标记阶段稍长,但远比并发标记时间短.

4.并发清除(CMS Concurrent Sweep)

CMS收集器的缺点是:

1)吞度量降低了;

2)无法清除浮动垃圾(因垃圾回收阶段,用户线程执行产生的垃圾);

3)标记清除算法会产生内存碎片.

7.G1收集器

G1收集器是最先进最前沿的垃圾收集器,特点:

1.并行与并发,和CMS收集器类似;

2.分代收集.G1能独立管理整个Java堆的垃圾收集;

3.空间整合,不产生内存碎片.从整体看,G1是基于标记整理算法,从局部(两个Region之间)上来看是基于复制算法;

4.可预测的停顿.

G1收集器把整个Java堆划分成多个大小相等的独立区域(Region).G1跟踪每个Region的垃圾堆积的价值大小(回收所获得空间和回收耗时的经验值).

在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(Garbage-First的名称由来).

G1收集器执行步骤:

1.初始标记(Initial Marking)

2.并发标记(Concurrent Marking)

3.最终标记(Final Marking)

4.筛选回收(Live Data Counting and Evacuation)

前面3个步骤都和CMS收集器类似.最后一步的筛选回收中,G1收集器首先对各个Region的回收价值和成本进行排序,根据用户期望停顿时间来制定回收计划.

从Sun公司透露出来的信息来看,筛选回收阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控.

而且停顿用户线程将大幅提高收集效率,所以采用暂停用户程序并行执行筛选回收的方案.

时间: 2024-12-06 20:22:55

Java虚拟机的内存管理----垃圾收集器的相关文章

Java虚拟机一 内存管理机制

Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的数据区,也就是说每一个线程都有自己的这么一个区域存放自己的数据,而青色区域则是线程共享的,里面的数据为所有线程共有,原则上都有权限访问. 2.程序计数器: 用途:用来给程序导航指路的.这个是一块较小的内存空间,可以看做是当前线程执行的字节码的行号指示器.理解就是虚拟机把java源代码编译成了字节码,

Java虚拟机的内存管理

众所周知,Java程序员写的代码是没有办法控制Java对象的内存释放的,完全有JVM暗箱操作. 虽然程序员把内存的释放的任务都交给了Java虚拟机,但是并不代表Java程序就不存在内存泄漏. 反而,某程度上,当出现内存泄漏,Debug会变得难度更大. 所以,Java程序员,有必要去了解Java虚拟机对于内存的管理以及垃圾回收的机制. Java虚拟机是如何判断一个对象可以回收? 当一个对象没有被任何其他所引用时,这个对象被Java虚拟机视为可回收. 早起的虚拟机,使用引用计数的方法判断对象是否可回

深入了解Java虚拟机和内存管理

1.java程序的执行过程      java源文件->解析器->class文件->java类加载器->java运行时数据区->执行引擎 2.我们接下来看一下java运行时数据区      包含程序计数器,虚拟机栈,本地方法栈,方法区,堆,其中程序计数器,虚拟机栈,本地方法区属于指令,方法区和堆属于数据.  一.程序计数器        用来指示程序执行哪一条指令,这跟汇编语言的程序计数器的功能在逻辑上是一样的.JVM规范中规定,如果线程执行的是非native方法,则程序计数

Java虚拟机理解-内存管理

运行时数据区域 jdk 1.8之前与之后的内存模型有差异,方法区有变化(https://cloud.tencent.com/developer/article/1470519). java的内存数据区域划分: 程序计数器 虚拟机栈 本地方法栈 堆 方法区 程序计数器(Program Counter Register) 理解为当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常.线程恢复等基础功能依赖于此. 每个线程独

深入理解_JVM内存管理垃圾收集器05

1.垃圾收集器(内存回收方法的具体实现): 名词解释: 并行(Parallel):多条垃圾线程并行工作,但是此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(并不一定是并行的,可能会交替执行),用户程序继续运行,而垃圾收集程序运行于另一个CPU上. HotSpot虚拟机包含的所有收集器如下图: 说明: (a)JDK1.6_Update14之后引入了Early Access版G1收集器. (b)如果两个收集器之间存在连线,就说明它们可以搭配使用. <Y

Java虚拟机:内存模型详解

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实例的时候,虚拟机要为对象分配内存,Java虚拟机又是如何配分内存的呢?这些都涉及到Java虚拟机的内存划分机制,今天我们就来探究一下Java虚拟机的内存模型. Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间,有的区域随

如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习<深入理解java虚拟机-JVM高级特性与最佳实践>这本书,终于初步了解了一下java虚拟机的内存模型.本文通过写出使jvm发生内存溢出异常的代码来对自己的学习结果进行总结,同时也提醒自己以后写代码时候不要再跳进这个坑啦. java的内存管理是由java虚拟机自动进行管理的,并不需要程序员过多的手动干预

Java虚拟机之内存简介

本文主要介绍Java虚拟机的内存分布以及对象的创建过程. 一.Java虚拟机的内存分布 文章开始前读者需要了解Java虚拟机的运行时数据区是怎样划分的.如下图所示: 1.程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,所以在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令.因此,为

关于 Java虚拟机:内存处理与执行引擎

一.Java技术体系简介: Java技术体系包括以下几个组成部分: java程序设计语言 各种硬件平台上的java虚拟机 Class文件格式 Java API 类库 来自商业机构和开源社区的第三方类库 JDK(java Development Kit):包括java程序设计语言,java虚拟机,java API类库.JDK是用于支持java程序开发的最小环境. JRE(java Runtime Environment) 包括java API类库中的java SE API子集,java虚拟机.JR