JVM的垃圾收集

原创 2016年08月30日 16:51:39

       上一章主要讲解了jvm的内存组成。这一章,来说一下,jvm中的垃圾回收。

垃圾回收策略

引用计数法

       比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

标记清除法

标记清除
       此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

复制法

复制法
       此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

标记压缩法

标记压缩
       此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

垃圾收集算法

       根据上一篇文章的内存结构。堆中是分区域的。不同的区域有不同的策略。

Young代回收算法:

       因为Young代都是短命对象,一次YoungGC会回收大部分对象,只有少量会剩下来。ParNew采用多线程,Stop The World的方式,采用复制算法进行回收。
ParNew收集
特点:
- Stop The Workd
- 多线程并发回收
- 复制算法,内存回收后方便分配

Old代回收算法:

cms收集器

回收步骤

  • 初始化清除:Stop The World 标记由根可以直达的对象
  • 并发标记:并发标记可达对象
  • 重新标记:Stop The World并发查找前一阶段新生代晋升或者新分配,被
  • 更新的对象
  • 并发清理
  • 线程重置

优点

  • 低延迟

缺点

  • 因为是基于标记清除,容易产生碎片

小结:

       虽然我不认为学习java必须去了解Java底层的实现,但是我想如果你更加理解JVM和GC的话,你就会更加理解Java,在以后的学习和工作中绝对受益匪浅。毕竟我们的目标不是刷墙工,不是搬运工,而是开发攻城狮啊!

版权声明:本文为博主原创文章,未经博主允许不得转载。

《Java Performance》笔记2——JVM命令行选项及垃圾收集日志解析

1.JVM命令行选项: HotSpot VM运行时系统解析命令行选项,并据此配置HotSpot VM, HotSpot的命令行选项主要有3类: A. 标准选项: JVM规范要求所有的JVM都必...
  • chjttony
  • chjttony
  • 2015年05月21日 20:24
  • 1840

深入理解JVM之垃圾回收详解

一、 垃圾收集的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM...
  • lizhongkaide
  • lizhongkaide
  • 2016年02月25日 16:19
  • 5258

深入理解JVM(三)——垃圾收集策略详解

Java虚拟机的内存模型分为五个部分,分别是:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。这五个区域既然是存储空间,那么为了避免Java虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集...
  • u010425776
  • u010425776
  • 2016年04月19日 12:36
  • 3788

jvm 垃圾回收机制 安全点

上一节,我们说到  jvm 保洁阿姐一边打扫的,别人一边扔垃圾怎么处理呢? 其实很简单,jvm保洁阿姐再打扫前,告诉公司所有说:我要打扫了,你们不准扔垃圾了;OK解决了! 哈哈。那在jvm垃圾回收中,...
  • lisi1129
  • lisi1129
  • 2017年07月24日 14:15
  • 135

Java JVM 8:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

在什么时候首先需要知道,GC又分为 minor GC 和 Full GC (也称为 Major GC )。Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivo...
  • hutongling
  • hutongling
  • 2017年04月09日 20:39
  • 769

JVM 垃圾收集

1.引用计算法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加一,当引用失效时,计数器值减一。当该对象的计数器值为0时,表明该对象不可用,虚拟机可以对其进行回收。但是不能解决循...
  • AustLittleCao
  • AustLittleCao
  • 2016年10月31日 16:28
  • 164

jvm垃圾收集

垃圾回收历史,早在Lisp 就有了垃圾收集的功能.垃圾收集的问题主要在三个地方:哪些对象需要回收,在什么时候回收对象,如何回收对象. 一.哪些对象需要回收     判断哪些对象需要回收...
  • iloveyin
  • iloveyin
  • 2015年12月17日 18:03
  • 1865

JVM垃圾收集

转载自:http://blog.csdn.net/ns_code/article/details/18076173               http://www.cnblogs.com/laoya...
  • zero__007
  • zero__007
  • 2015年07月20日 09:59
  • 251

【深入理解JVM】:垃圾收集算法

垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。标记-清除算法算法的执行过程与名字一样,先标记所有需要回收的...
  • u011080472
  • u011080472
  • 2016年05月05日 16:31
  • 1934

Jmeter录制复杂页面脚本时Jvm崩溃或者栈溢出问题的解决

使用Jmeter进行性能测试,录制Web页面脚本时,如果页面过于复杂,尤其在一些企业级应用系统中,会出现Jmeter突然崩溃,日志中抛出Java栈溢出错误。 经过排查,发现是在页面中对Form ac...
  • jhyxzsf
  • jhyxzsf
  • 2016年02月29日 12:09
  • 757
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM的垃圾收集
举报原因:
原因补充:

(最多只允许输入30个字)