Jvm垃圾回收——第二章

上文简单介绍了JVM的一些原理作为铺垫,接下来介绍一下垃圾回收。

java的垃圾回收机制,主要采用的是分代回收机制。

分为:

1)新生代:新出生的对象在这里创建,又分为一个eden(伊甸园,这个名字很贴切),两个survivor区。

刚刚出生的小baby,当然放在eden,

2)旧生代:因为在新生代活的较长,在若干次内存回收后进入这,作为生命周期较长的对象。

3)持久代:主要是类二进制字节码,放在方法区。

以上三个地方就是内存回收进行的主要场地。

为什么采用这种方式呢?

我有一些自己的看法,对整块堆内存进行全盘的垃圾回收是很耗费资源滴~ 因为往往需要让应用程序停下来,各种清除啊,复制啊,压缩啊,造成应用程序停顿,外界看起来就是程序进入了卡巴斯基模式。

分代回收机制的思想尽量避免全盘GC,分成几个区分别放不同生命周期的对象。比如新生代就是放生命周期短的对象,这块我可以整天GC,然后把很久都不死的对象放入旧生代,where will not GC so frequently.这是我的一点见解,欢迎吐槽。

JVM调优,主要是两个方面需要考虑

1)大小:这些场地的大小

-Xmx 堆内存最大可用内存

-Xms 堆内存初始内存大小

-Xss 线程的堆栈大小

-XX:MaxPermSize 最大持久代大小

-XX:PermSize大小

-XX:NewRatio 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)

-XX:SurvivorRatio Eden区与Survivor区的大小比值

2)算法:回收收集器最合适方式的选择

针对新生代和旧生代,又有不同的两套算法。

A、新生代垃圾收集器

1、Serial收集器

特点,单线程工作方式,暂停工作线程直到垃圾回收结束。

2、ParNew收集器

特点,多线程工作方式,也会暂停工作线程,但是在多CPU机器上相对于1能缩短回收时间。

3、Parallel收集器

特点,多线程工作方式,跟工作线程并行工作,追求高吞吐率。

用Parallel收集器是一种怎么样的体验?它关注的是提高jvm的吞吐率,就是CPU有效运行时间/CPU中运行时间。

在吞吐率很高的系统中,比如运行100分钟,可能有1秒钟系统上厕所去了,导致用户等待了1秒,哈哈哈哈。

此收集器只在新生代采用多线程,而下面介绍的CMS虽然也是多线程工作但那是在老生代工作。

-XX:+UseParallelGC或-XX:+UseParallelOldGC

缺点是会暂停工作线程,当堆越大,暂停的时间就越长。

B、老生代垃圾回收器

1、Serial Old

作为上面在老生代的对应,其实很少用到。

2、Parallel Old

-XX:+UseParallelOldGC

3、CMS收集器(重点)

-XX:+UseConcMarkSweepGC

特点,与工作线程并行运行,因此造成的停顿很短咯,系统的相应时间更快。

那时什么样的体验呢?

点开网页,一下子唰唰唰的就出来了。因此适合用在Web系统。

缺点也是有的,比如:

1)与工作线程争夺CPU,导致吞吐率降低。

2)如果浮动垃圾太多,造成内存不够(Concurrent Mode Failure),就会触发一次Serial Old的full GC,停顿就很长很长。浮动垃圾的产生是因为工作线程与GC线程同时运行,GC线程刚刚完成标记,就产生了新的垃圾,而这部分垃圾只能等下一次标记。这部分未标记的垃圾就不能再本次GC中回收。

-XX:CMSInitiatingOccupancyFraction

3)CMS基于标记-清除的方式会导致大量的内存碎片,对与分配大对象就显得很麻烦,可能不得不做一次full GC来腾出足够空间。

解决方案:

-XX:UseCMSCompactAtFullCollection 让每次FGC之后整理内存,合并碎片。

-XX:CMSFullGCBeforeCompaction 比上面人性化一点,设置每隔几次FGC才压缩一次。

时间: 2024-12-07 09:03:58

Jvm垃圾回收——第二章的相关文章

Jvm垃圾回收——第一章

关于JVM调优,有哪些梗值得去学习呢? 对于一样事物,我总会问自己几个问题: 1)它是什么,包括什么内容? 2)它作什么用?解决什么问题? 一.是什么? JVM是解析和运行.class二进制文件的东西. 包括好几部分: 1)栈:基本数据类型 2)堆:引用类型 3)方法区:类字节码 4)运行时数据池 5)本地方法区 二.什么用? .class二进制文件是java文件编译后的产物,JVM也起到了操作系统OS和Java语言之间的桥梁作用,为Java语言提供跨平台的特点,因为不同的操作系统也有对应的JV

JVM垃圾回收算法 总结及汇总

先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,

JVM垃圾回收算法(最全)

JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C

JDK分析工具&JVM垃圾回收(转)

转自:http://blog.163.com/[email protected]/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/javase/7/docs/     ---->http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html   java命令的各种选项的说明 参考书籍: <深入理解Java虚拟机:JVM高级特性与最佳实践

JVM——垃圾回收

目录: 如何判断垃圾是否回收? 引用计数法 可达性分析算法 四种引用 引用队列 垃圾回收算法 标记清除算法 复制算法 标记整理算法 分代垃圾回收 新生代 老年代 Minor GC 和 Full GC的区别 总结 垃圾回收器 原理 串行回收器 吞吐量优先 获取最短停顿时间优先(CMS) G1 垃圾回收调优  方向 新生代调优 老年代调优 案例 一.如何判断垃圾是否回收 1.1 引用计数法 在对象头处维护一个counter,每增加一次对该对象的引用计数器自加,如果对该对象的引用失联,则计数器自减.当

深入JVM垃圾回收机制,值得你收藏

JVM可以说是为了Java开发人员屏蔽了很多复杂性,让Java开发的变的更加简单,让开发人员更加关注业务而不必关心底层技术细节,这些复杂性包括内存管理,垃圾回收,跨平台等,今天我们主要看看JVM的垃圾回收机制是怎么运行的,希望能够帮到大家, 哪些对象是垃圾呢? Java程序运行过程中时刻都在产生很多对象,我们都知道这些对象实例是被存储在堆内存中,JVM的垃圾回收也主要是针对这部分内存,每个对象都有自己的生命周期,在这个对象不被使用时,这个对象将会变成垃圾对象被回收,内存被释放,那么如何判断这个对

JVM垃圾回收机制

JVM采用分代的垃圾回收策略:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 从垃圾回收角度看内存分配 从JVM垃圾回收的角度来看,Java内存分为三个区:新生代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation),如下图. 新生代: 所有新生成的对象首先都是放在年轻代的.年轻代分三个区.一个Eden区,两个Survivor区(一般而言).大部分对象在Eden区中生成.

浅析JVM垃圾回收机制

首先我们需要知道Java的内存分配与回收全部由JVM垃圾回收机制自动完成.每种JVM实现可能采用不同的方法实现垃圾回收机制.在收购SUN之前,Oracle使用的是JRockit JVM,收购之后使用HotSpot JVM.目前Oracle拥有两种JVM实现并且一段时间后两个JVM实现会合二为一.HotSpot JVM是目前Oracle SE平台标准核心组件的一部分.市面上探讨垃圾回收机制,默认都是基于HotSpot JVM的.Ok,我们切入正题,先来看下JVM的内存区域模型, 这张图非常直观的展

JVM内存管理和JVM垃圾回收机制

JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采用不同的垃圾回收机制. AD: 你对JVM内存组成结构和JVM垃圾回收机制是否熟悉,这里和大家简单分享一下,希望对你的学习有所帮助,首先来看一下JVM内存结构,它是由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示. JVM学习笔记 JVM内存管理和JVM垃圾回收 JVM内存组成结构 JVM内存