1、什么是垃圾
垃圾,内存中的垃圾,即内存中已无效但又无法自动释放的空间。在Java 语言中,没有引用句柄指向的类对象最容易成为垃圾。产生垃圾的情况有很多,主要有以下3 种:
(1)超出对象的引用句柄的作用域时,这个引用句柄
引用的对象就变成垃圾。
例1
{
Person p1 = new Person();
…… }
引用句柄p1 的作用域是从定义到“}”处,执行完这对大括号中的所有代码后,产生的Person 对象就会变成垃圾,因为引用这个对象的句柄p1 已超过其作用域,p1 已经无效,Person 对象不再被任何句柄引用了。
(2)没有超出对象的引用句柄的作用域时,给这个引
用句柄赋值为空时,这个引用句柄引用的对象就变成垃圾。
例2
{
Person p1 = new Person();
…..
p1 = null;
…. }
在执行完“p1=null;”后,即使句柄p1 还没有超出其作用域,仍然有效,但它已被赋值为空,不再指向任何对象,则这个Person 对象不再被任何句柄引用,变成了垃圾。此后p1 还可以指向其它Person 对象,因为还没有超出它的作
用域。
(3)创建匿名对象时,匿名对象用完以后即成垃圾。
例3
{
new Person(); // 因为是匿名对象,没有引用句柄指向它,即为垃圾
new Person().print(); //当运行完匿名对象的print()方法,这个对象也变成了垃圾
……
}
因此,在程序中应尽量少用匿名对象。
2 、 垃圾回收
在 Java 程序运行过程中,一个垃圾回收器(Garbage Collector,简称GC)会不定时地被唤起检查是否有不再被使用的对象,并释放它们占用的内存空间。垃圾回收器的回收无规律可循,可能在程序的运行的过程中,一次也没有启动,也可能启动很多次。因此,并不会因为程序代码一产生垃圾,垃圾回收器就马上被唤起而自动回收垃圾,很可能到程序结束时垃圾回收器都没有启动。所以垃圾回收器并不能完全避免内存泄漏的问题。
另一方面,垃圾回收会给系统资源带来额外的负担和时空开销。它被启动的几率越小,带来的负担的几率就越小。因此,垃圾的回收策略也很重要。
3、 垃圾回收器的回收策略
不同厂商、不同版本的Java 虚拟机中的内存垃圾回收机制并不完全一样,通常越新版本的内存回收机制越快。而不同的Java 虚拟机采用不同的回收策略,常用的有两种:复制式回收策略和自省式回收策略。
复制式回收策略:先将正在运行中的程序暂停,然后把正在被使用的所有对象从它们所在的堆内存A 里复制到另一块堆内存B,再释放堆内存A 中的所有空间,这些不再使用的对象所占用的内存空间就会被释放掉。这种方式需要维护所需内存数量的至少两倍的内存空间,适合垃圾比较多的情况。当程序只产生了少量垃圾或者没有垃圾时,这种回收策略的效率就非常低。
自省式回收策略:首先检测所有正在使用的对象,并为它们标注,比如用1 来标注正在使用的对象,用0 来标注不再被使用的对象,然后将所有标注为 0 的内存空间一次释放。因为标注会增大系统的开销,因此这种方式的速度仍然很慢,尤其是在垃圾比较多的情况下,效率会很低。这种方法适合垃圾比较少的情况。
这两种方式具有互补性,因此在一些Java 虚拟机中两种方式被有机的结合运用。
分享到:
相关推荐
Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 垃圾回收机制的算法有多种...
本文将详细介绍Java中的垃圾回收机制及其工作原理,并探讨JVM如何管理和优化垃圾回收过程。 #### 二、JVM内存模型 JVM内存模型主要包括永久代(Permanent Generation, PermGen)、堆(Heap)和栈(Stack)三大部分。值得...
Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收...
Java中类的生命周期与java垃圾回收机制
Java垃圾回收机制的详细介绍,调理比较清晰,个人进行的总结。
Azul Systems CTO & co-Founder, Gil Tene 在SpringOne2GX 2012大会上发表的演讲资料,全面深入地阐述Java垃圾回收的四种机制。并介绍了当今世界上性能与吞吐量最高的JVM产品Zing JVM。 如果希望深入了解Java的垃圾...
Java垃圾回收机制(GC)是Java编程语言的关键特性,它自动管理内存,释放不再使用的对象,以防止内存泄漏。GC的运作方式主要有两种策略:引用计数和对象引用遍历。 引用计数是一种简单但不完美的方法。每个对象都有...
【Java面试题】Java垃圾回收机制
本文将深入对比Java与C#这两种广泛使用的编程语言中的垃圾回收机制,帮助开发者更好地理解它们的工作原理以及差异。 #### 二、Java的垃圾回收机制 ##### 2.1 Java内存区域 Java虚拟机(JVM)将内存划分为几个主要...
但是由于SUN公司的Java Programming Language SL-275 课程的标准教材中,对有关垃圾收集器的内容只做了非常简单的介绍,而另外的一些关于Java技术的书籍,比如《Java 2 核心技术》(Core Java 2)、《Java编程思想》...
本文将详细探讨GC的实现原理、不同算法的细节以及其在JVM中的应用,并通过代码示例展示如何在Java中实践垃圾回收机制。 Java中的垃圾回收机制是一个复杂而高效的内存管理机制,它通过自动回收不再被程序使用的内存...
本文将深入探讨Java中的垃圾回收机制,包括其工作原理、常用算法以及实际应用中的注意事项。 #### 二、垃圾回收的基本概念 **1. 什么是垃圾回收** 垃圾回收(Garbage Collection, GC)是指在程序运行过程中自动...
Java 垃圾回收机制是 Java 语言中的一种自动内存管理机制,它可以自动回收内存中的垃圾,避免代码运行时由于忘记释放对象而带来的内存泄漏问题。 Java 中的垃圾回收机制主要通过两种算法来判断对象是否可以被回收,...
你认真演示了一遍,你就能明白JAVA的垃圾回收机制。当然文档写的不一定全面,比如文档当中关于老年区少年区有一页写的不是很完整,我也没有添加太多进去,但是还是很有很全面很有参考意义的。
Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于释放垃圾占用的空间,以便提高系统性能和避免内存泄露。在Java中,垃圾回收机制主要解决两个问题:如何确定某个对象是“垃圾”?采用什么样的策略来进行回收...