JVM-垃圾收集器

JVM 概览

1995;write one run everywhere,早起java,无论开发效率多高,内存管理多好,程序性能一直是程序员的痛。

随着版本的更新,JIT编译器、日渐成熟的垃圾收集器和不断改进的运行环境,

对于性能和扩展性,不能作为黑盒来看,

JVM有三个主要组件:VM运行时,JIT编译器以及内存管理器

JIT编译器和垃圾收集器(serial、Parallel Scavenge收集器(Throughput)、cms或G1)可插拔

 

大多数分配对象的存活时间很短

存活时间长的很少引用存活时间短的对象

基于上面两个分析结果将堆分为两个物理区,这就是分代

新生代:gc比较频繁     MinorGC

老年代:新生代长期存活的,老年代空间比新生代空间大   Full GC

永久代:(方法区)

分代收集好处:可以依据其特性使用最适当的垃圾收集算法:

新生代:速度快的垃圾收集器,因为Minor GC频繁,会浪费一点空间

老年代:使用空间效率高的垃圾收集器,

 

垃圾回收的三种方式:

图 垃圾收集的操作序列(方式)

备注:除了上面的压缩、清除。还有一种复制算法

 

垃圾收集器:

Serial为单线程Stop-The-Word式的收集器:新生代中采用的是复制收集算法,老年代中采集标记清除压缩算法(serial old).

Serial: 对停顿时间要求不高的,Full GC 大约几秒钟,对JVM干扰最小

Parallel Scavenge收集器:主要不同在于它可以和CMS配合。Parallel Scavenge为多线程的stop-the-word式的收集器,采用复制收集算法。

图 Stop-The-Word式的垃圾收集

备注:图中b早起版本在老年代是串行收集,引入parallel  old收集器之后才改变。

Parallel收集器:吞吐量为先(Parallel Scavenge收集器(Throughput)、Parallel New收集器和Parallel Old收集器):引用在多处理器,充分利用处理器资源,整体改善垃圾收集的整体效率,也改善应用的整体吞吐量。

 

3.3.7 Mostly-Concurrent收集器:低延迟为先(CMS)

      对许多应用来说,快熟响应比端到端的吞吐量更重要,在stop-the-world模式中,应用程序在垃圾收集开始停止运行,在收集后才继续运行,虽然minorGC不会太占时间,但是fullgc会到导致停顿时间比较长,特别堆比较大的时候。为了应对这种场景, JVM引入了CMS(Concurrent Mark-Sweep GC)在新生代方式与Parallel和serial相同, 在老年代则尽可能并发,每次垃圾收集周期只会有2次短停顿。

从图中可以看出CMS是如何工作的:开始有一个短的停顿,称之为初始标记,它主要标记那些从外部(GC Roots)直接可达的老年代对象。然后再并发标记阶段标记这些对象可达的存活对象,由于在标记阶段应用程序还在运行,所以可能不全,所以再次停顿,重新标记:重新遍历在并发阶段有变化的对象进行标记(数据结构卡表)

为了减少重新标记时的工作量,cms引入了并发预清除阶段:重新遍历在并发被改掉的对象,减少重新标记的时间

Cms:需要遍历两次,增加开销,减少停顿时间,清除操作可以参考垃圾收集的操作序列(b)

缺点:

  1. 采用清除的回收方式,空闲区域不连续,垃圾收集器需要使用一个数据结构记录哪部分堆有空闲空间,这是Minor GC产生额外开销
  2. 需要更大的java堆,回收周期时间长,只有在清除的时候空间才会回收,另外有一些不能完全标记到,形成浮动垃圾。
  3. 缺乏压缩,导致空间碎片化,如果没有足够空间,使用stop-the-world进行空间压缩。

与parallel相比,老年代停顿变短了(比较乐观),但是新生代稍微拉长,吞吐量降低,堆大小增长,并且由于并发,垃圾收集还会占用应用cpu周期,需要快速响应(数据追踪服务器,web服务器),像这样的应用非常多

Garbage-First收集器:cms代替者

 

垃圾收集器比较

垃圾收集参考资料:

 https://blogs.oracle.com/jonthecollector/

JDK 7 Update 4以后完全支持G1:

https://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

JVM性能检测

参考资料

  1. Java平台的监视和管理:http://download.oracle.com/javase/1.5.0/docs/guide/management/
  2. Java SE监视和管理指南:

http://docs.oracle.com/javase/6/docs/technotes/management/toc.html

  1. JMX Agents连接明解:

http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/jmx_connections.html

  1. VisualVM特性:

http://visualvm.java.net/features.html

  1. Jvmstat3.0网站:

http://www.oracle.com /technetwork/java/jvmstat-142257.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值