当前位置: 代码迷 >> 综合 >> [翻译]Java Garbage Collection Basics Java 垃圾回收基础 之3 描述垃圾回收
  详细解决方案

[翻译]Java Garbage Collection Basics Java 垃圾回收基础 之3 描述垃圾回收

热度:21   发布时间:2024-01-11 07:38:51.0

描述垃圾回收

什么是自动垃圾回收

自动垃圾回收是一个处理过程,包括:观察堆内存,找到哪些对象在使用,哪些没有,并且删除掉没有使用的对象.一个在使用的对象或者被引用的对象,意味这你程序的某个部分依然维系这一个指向该对象的指针.一个没有使用的对象或者未被引用的对象意味这该对象不再被你程序的任何部分引用.所以被这些不再使用的对象占用的内存可以得到回收.

在一般的编程语言,比如C,内存的释放和分配都需要手动处理.在JAVA中,内存回收的过程被垃圾收集器(GC)自动处理.下面的步骤演示了这个过程:

Step1 标记

处理的第一个过程被称作标记.该阶段GC识别哪些内存区域是在使用,哪些不是.
mark
在被引用的对象以蓝色标志.没被应用的对象用金色标记.所有对象在标记阶段都被扫描了来用于决定哪些在被使用.这是一个非常耗时的过程如果系统中所有的对象都需要被扫描的话.

Step2 普通删除

普通删除直接移除掉没被引用对象和指针.
normal-delete
内存分配器维护一个空闲空间的引用块,用于分配给新对象.

Step2a 删除后压缩(可选)

为了提升性能,在删除没被引用的对象后,你也可以选择压缩被引用对象占用的空间.通过将被引用对象移到一起,这让新的内存分配更容易也更简单.

delete-with-compact

为什么分代收集

正如前面说说,必须标记和压缩JVM中所有对象是低效的.随着越来越多的对象分配,对象的列表也越来越长,导致垃圾回收时间也加长.但是经验表名,大多数对象都不会存活很久.

如下是一个测试数据.Y轴代表已分配的字节,x轴代表随着时间新分配的字节.

objects-alloc
如你所见,随着时间推移,越来越少的对象可以保留下来.事实上,很多对象都只有很少的生存时间,正如图中左边的部分所示.

JVM 中的 “代”

上面的对象分配行为可以用来提升JVM的性能.所以堆被分为小的部分或者代.堆中的部分:年轻代,年老代和持久代.
这里写图片描述

年轻代:新生对象分配和变老的地方.当年轻代空间满了之后,会触发MINOR GC.MINOR GC 通过假定很高的对象死亡率来得以优化.一个充满死亡对象的年轻代可以被很快收集一些存活的对象会变老,最终会进入年老代.

Stop the world event(STW) -所有MINOR GC都是”停止世界”事件,这意味着所有的应用线程都停掉了 直到该操作完成.MINOR GC 总是STW 事件.

年老代:用于存放长时间存活的对象,典型的,会设置一个阈值,当年轻代的对象的年纪达到该阈值后,这些对象就被移到年老代.最后,年老代需要被回收.该事件成为:MAJOR GC.
MAJOR GC 也是STW 事件.通常一个MAJOR GC,会比较慢因为它包含了所有存活的对象,所以对响应性应用而言,MAJOR GC 需要最小化.还有就是STW的时间会受到在年老代使用何种GC影响.

持久代:包含JVM描述应用中类和方法的元信息.持久代在JVM运行时根据应用使用的类来填充,除此之外 JAVA SE的类库的类和方法也可能会存在那里.
当JVM发现某个类不再需要,而且需要腾出新的空间给别的类时,类空间可能会被回收.持久代被包括在一次FULL GC中.
优化GC 使用JAVA 5

  相关解决方案