JVM架构(008)_java垃圾回收机制是什么

转载 2016年08月29日 16:38:40

1、如何判断垃圾对象

垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理。通常的编程语言都会用以下算法之一进行判断:

  1. 引用计数(ReferenceCounting)算法 
    这种方法比较简单直观,核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收。

FlashPlayer/Python使用该算法,简单高效。但是,Java/C#并不采用该算法,因为该算法没有解决对象相互引用的问题,即:当两个对象相互引用且不被其它对象引用时,各自的引用计数为1,虽不为0,但仍然是可被回收的垃圾对象。

  1. 根搜索(GC Roots Tracing)算法

基本原理是:GCRoot对象作为起始点(根)。如果从根到某个对象是可达的,则该对象称为可达对象(存活对象,不可回收对象)。否则就是不可达对象,可以被回收。

2、新生代如何清理垃圾

垃圾清理算法

新生代的垃圾收集器通常会假设大部分的对象的存活时间都非常短,只有少数对象的存活时间比较长。根据这个假设,新生代清理垃圾的算法主要是复制算法(Copying)。通过复制算法,可以将没有被引用的对象清理掉,并且可以将经过若干次(可配置)清理仍然存活的对象放入老生代

了解堆内存看这里:java堆内存是什么样的 
了解堆的Copying算法看这里:什么是新生代的Copying算法

垃圾清理触发方式

新生代采用“空闲指针”的方式来控制GC触发,指针保持最后一个在新生代分配的对象位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。新生代的GC通常叫做young GC,有时候也叫minor GC

在连续分配对象过程中,对象会按照复制算法逐渐从Eden区Survivor区,最后到老生代

常用配置

  • 新生代的大小:-Xmn

  • Eden区和Survivor区的比值:-XX:SurvivorRatio

3、老生代如何清理垃圾

垃圾清理算法

老生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记/整理(也叫标记-紧凑,Mark-Compact)算法。

了解堆的 Mark算法看这里:什么是老生代的Mark算法 
垃圾清理触发方式

老生代的GC,通常叫做full GC,也叫major GC。老生代有多情况会触发GC,不过一般来说发生频率不高:

  1. 旧生代空间不足 
    调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在老生代创建对象。

  2. Pemanet Generation空间不足 
    增大Perm Gen空间,避免太多静态对象

  3. GC后晋升到老生代的平均大小大于老生代剩余空间 
    控制好新生代和旧生代的比例

  4. 手动调用System.gc() 
    垃圾回收不要手动触发,尽量依靠JVM自身的机制。

常用配置

  • 堆的初始空间:-Xms,可以推算出老生代的大小为-Xms减去-Xmn

  • 堆的最大空间:-Xmx

  • 最大年龄阈值:-XX:MaxTenuringThreshold,即新生代转入老生代的存活次数

  • 老生代和新生代的比值:-XX:NewRatio,例如该值为3,则表示新生代与老生代比值为1:3

4、垃圾回收方式有哪些

以上是java垃圾回收机制的基础,JVM为我们提供了若干可供选择的回收方式,即我们俗称的垃圾回收器。主要有4种:

  1. 串行垃圾回收器(Serial Garbage Collector)
  2. 并行垃圾回收器(Parallel Garbage Collector)
  3. 并发标记扫描垃圾回收器(CMS Garbage Collector)
  4. G1垃圾回收器(G1 Garbage Collector)

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

从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别对于JVM自身的物理结构,我们可以从下图鸟瞰一下:对于JVM的...
  • u011225629
  • u011225629
  • 2015年10月09日 15:06
  • 4194

JVM:垃圾回收机制和调优手段

引言: 我们都知道JVM内存由几个部分组成:堆、方法区、栈、程序计数器、本地方法栈 JVM垃圾回收仅仅针对公共内存区域即:堆和方法区进行。 本文主要讨论两点,一是垃圾回收策略,二是调...
  • x1066988452
  • x1066988452
  • 2016年04月15日 10:16
  • 2965

JVM:垃圾回收机制和调优手段

jvm 垃圾回收机制 调优手段
  • wfzczangpeng
  • wfzczangpeng
  • 2016年07月03日 19:08
  • 1951

JVM的垃圾回收机制详解和调优

  • 2017年07月08日 14:48
  • 23KB
  • 下载

jvm垃圾回收机制总结

  • 2012年12月28日 11:11
  • 1.73MB
  • 下载

JVM原理、架构—垃圾回收机制

搞java的都知道在编写java程序的时候不需要要考虑资源的释放,因为JVM会自动将不是用的对象GC掉。这里自动是个什么原因呢?就是程序员不能对垃圾进行回收,垃圾回收并不会及时清理内存,即便有时候程序...
  • colin_yjz
  • colin_yjz
  • 2015年06月22日 10:33
  • 675

java 技术:jvm垃圾回收机制有哪些

1.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1;当删除一个指向自己的指针时,计数值减1,如果计数值减为0...
  • zzgzhangzhiguang
  • zzgzhangzhiguang
  • 2017年03月21日 20:50
  • 229

Java虚拟机的JVM垃圾回收机制

原文地址:http://blog.csdn.net/zhangren07/article/details/6270895 1.JVM内存空间     JVM堆(Heap)= 新生代(...
  • yxwb1253587469
  • yxwb1253587469
  • 2017年08月09日 16:12
  • 80

三大Java 虚拟机垃圾回收机制的比较(HotSpot, JRockit, IBM JVM)

原文地址:http://apmblog.compuware.com/2011/05/11/how-garbage-collection-differs-in-the-three-big-jvms/ ...
  • AbnerChai
  • AbnerChai
  • 2013年06月03日 15:02
  • 2701

Java虚拟机的JVM垃圾回收机制

1.JVM内存空间  JVM堆(Heap)= 新生代(Young) + 旧生代(Tenured) 分区作用: 新创建的对象通常先将其分配在新生代中,在新生代中经过若干次GC之后仍未释放的对象,再将它...
  • zhangren07
  • zhangren07
  • 2011年03月23日 14:35
  • 12369
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM架构(008)_java垃圾回收机制是什么
举报原因:
原因补充:

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