`
yxwang0615
  • 浏览: 560901 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

java 垃圾对象何时被回收

    博客分类:
  • java
 
阅读更多

与C++一样,Java程序中同样会发生内存泄露的问题,但是Java中引入了垃圾回收机制。这里所说的垃圾就是那些泄露的内存。

在Java语言中,没有引用句柄指向的类对象最容易成为垃圾。产生垃圾的情况有很多,主要有以下3种:

(1)       超出对象的引用句柄的作用域时,这个引用句柄引用的对象就变成垃圾。

例:

       Person p1 = new Person();

       ……

引用句柄p1的作用域是从定义到“}”处,执行完这对大括号中的所有代码后,产生的Person对象就会变成垃圾,因为引用这个对象的句柄p1已超过其作用域,p1已经无效,Person对象不再被任何句柄引用了。       

(2)       没有超出对象的引用句柄的作用域时,给这个引用句柄赋值为空时,这个引用句柄引用的对象就变成垃圾。

例:

       Person p1 = new Person();  

       …..

       p1 = null;

       ….

C++与Java中对象销毁及内存泄露在执行完“p1=null;”后,即使句柄p1还没有超出其作用域,仍然有效,但它已被赋值为空,不再指向任何对象,则这个Person对象不再被任何句柄引用,变成了垃圾。此后p1还可以指向其它Person对象,因为还没有超出它的作用域。

(3)       创建匿名对象时,匿名对象用完以后即成垃圾。

例:

new Person();               //因为是匿名对象,没有引用句柄指向它,即为垃圾

new Person().print();

//当运行完匿名对象的print()方法,这个对象也变成了垃圾

……

       因此,在程序中应尽量少用匿名对象。

 

Java中的对象销毁:

 

       Java语言没有提供析构函数,要解决内存泄露的问题,要销毁不再被引用的对象,就要借助其它方法,因此Java提供了一种非常好的机制:垃圾回收机制,即Garbage Collector,简称GC。

       在Java中,不再被引用的对象所占据的内存由一个低优先级的垃圾回收线程自动回收。这个线程是在我们程序的执行过程中在后台持续运行的。在Java程序运行过程中,一个垃圾回收器会不定时地被唤起检查是否有不再被使用的对象,并释放它们占用的内存空间。垃圾回收器的回收无规律可循,可能在程序的运行的过程中,一次也没有启动,也可能启动很多次。因此,并不会因为程序代码一产生垃圾,垃圾回收器就马上被唤起而自动回收垃圾,很可能到程序结束时垃圾回收器都没有启动。所以垃圾回收器并不能完全避免内存泄漏的问题。

    正因为垃圾回收器启动的无规律性,Java又提供了一种强制启动垃圾回收器的方法:System.gc()方法。在程序中显式地加入这个语句,就会强制启动垃圾回收器。垃圾回收器启动后,就会等待时机释放不再被引用的对象所占据的内存空间。但并不是一启动垃圾回收器,它就马上回收垃圾,如果这时有高优先级的线程仍在运行,回收垃圾的线程需要等待这个高优先级的线程执行完毕以后才可执行。

    另一方面,垃圾回收会给系统资源带来额外的负担和时空开销。它被启动的几率越小,带来的负担的几率就越小。因此,不提倡在程序代码中加入大量的System.gc()语句。

    正因为垃圾回收器的自动回收功能,保证了Java开发的程序在长期运行期间产生比较少的内存泄露,提高了系统的性能,方便了用户的使用。

 

分享到:
评论
1 楼 wangxiang243 2013-05-26  
不错,学习了!

相关推荐

    java高级之垃圾回收机制

    其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...

    java垃圾回收机制简述

    3. **对象回收**:当对象不再被任何引用所指向时,即认为该对象已成为垃圾,可被垃圾回收器回收。 具体来说,Java中的垃圾回收过程涉及以下几个关键步骤: 1. **标记(Marking)**:首先,垃圾回收器会从GC Roots...

    Java垃圾回收详解

    ### Java垃圾回收详解 #### 垃圾回收基础概念 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地...

    java垃圾回收器代码举例

    Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...

    Java垃圾回收机制总结

    Java垃圾回收机制总结 Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 ...

    JAVA垃圾回收机制

    Java垃圾回收机制(GC)是Java编程语言的关键特性,它自动管理内存,释放不再使用的对象,以防止内存泄漏。GC的运作方式主要有两种策略:引用计数和对象引用遍历。 引用计数是一种简单但不完美的方法。每个对象都有...

    Java垃圾回收原理

    ### Java垃圾回收原理详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制是确保程序高效运行的关键技术之一。本文将深入探讨Java中的垃圾回收机制,包括其基本原理、不同类型...

    java垃圾回收及内存泄漏.pptx

    3. **对象回收算法**: - **引用计数算法**:每个对象包含一个引用计数器,每当有一个地方引用它,计数器加1;当引用失效时,计数器减1。当计数器为0时,对象可被回收。该算法简单,但难以处理循环引用的情况。 ...

    java垃圾回收(gc)机制详解.pdf

    Java垃圾回收(GC)机制是Java语言管理内存的自动化机制,它能够自动释放不再使用的内存空间,从而避免内存泄漏和程序崩溃等问题。在介绍Java GC机制之前,我们首先要了解垃圾回收的目的和意义。在任何程序中,内存...

    java垃圾回收

    垃圾回收器的工作就是找到这些垃圾对象,并释放它们占用的内存空间,以便让这些内存可以被再次分配给其他对象。 垃圾回收的过程主要包括三个阶段:标记、扫描和清理。首先,垃圾回收器会标记出所有活动对象,即那些...

    JAVA垃圾回收面试个人总结.doc

    Java垃圾回收机制是Java编程中一个非常重要的概念,尤其在面试和实际开发中常常被讨论。垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存...

    Java垃圾回收机制

    ### Java垃圾回收机制详解 #### 一、Java垃圾回收机制概览 Java作为一种现代的、面向对象的编程语言,其一大特色就是引入了自动垃圾回收机制。这一特性极大地简化了开发人员的工作,使得他们不再需要手动管理内存...

    java内存管理与垃圾回收

    Java 内存管理与垃圾回收是Java编程中至关重要的概念,它们确保了程序的稳定运行和内存的有效利用。Java在JVM(Java Virtual Machine)上运行,内存主要分为两个主要区域:栈(Stack)和堆(Heap)。 栈主要用于...

    Java垃圾回收机制详解和调优.doc

    Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收...

    Java与C#的垃圾回收机制

    ### Java与C#的垃圾回收机制 #### 一、引言 在现代编程语言中,内存管理是一项重要的功能,能够显著提升程序的稳定性和效率。本文将深入对比Java与C#这两种广泛使用的编程语言中的垃圾回收机制,帮助开发者更好地...

    Java垃圾回收机制的学习和使用

    Java垃圾回收机制是Java编程中至关重要的一部分,它自动管理内存,释放不再使用的对象,避免内存泄漏,并优化内存使用。Java虚拟机(JVM)的堆内存是存放对象的主要区域,当对象通过new等指令创建后,垃圾回收机制...

    Java对象的清除与垃圾回收.pdf

    在Java中,finalize()方法可以被子类重写,以便在对象被垃圾回收之前执行一些清理工作。例如,以下是一个finalize()方法的示例: public class Base { String s; Base(String s) { this.s = s; } public void ...

Global site tag (gtag.js) - Google Analytics