`

finalize()和gc()

    博客分类:
  • Java
 
阅读更多
引用
 

finalize()和gc()

(1)问题:finalize()函数是干嘛的?Java不是有Garbage Collection(以下简称gc)来负责回收内存吗?
回答:
gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内 存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行 内存回收就要靠finalize().
举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法 调用它(free()).
finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.









垃圾回收器负责回收所有无任何引用对象的内存空间。

注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身。

1. System.gc();   Runtime.getRuntime().gc() 这两种方法用于显示通知JVM可以进行一次垃圾回收,但垃圾回收机制具体在什么时间运行是无法预知的。

2.finalize() 方法 释放对象所占用的相关资源。

当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize()方法。如果在程序终止之前垃圾回收器始终没有执行垃圾回收操作,那么垃圾回收器将始终不会调用无用对象的finalize()方法。因为finalize()只有在垃圾回收器工作的时候才会被调用,也就是说,通过它进行资源释放并不能确保马上被释放,甚至可能根本不会被释放(因为垃圾回收器可能不会工作)。程序即使显式调用System.gc()或Runtime.gc()方法,也不能保证垃圾回收操作一定执行,因此不能保证无用对象的finalize()方法一定被调用。



关于finalize()方法:

java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。

      (1).对象不一定会被回收。
      (2).垃圾回收不是析构函数。
      (3).垃圾回收只与内存有关。
      (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。

     垃圾收集器在进行垃圾收集的时候会自动呼叫对象的finalize方法,用来进行一些用户自定义的非内存清理工作,因为垃圾收集器不会处理内存以外的东西。所以,有的时候用户需要定义一些清理的方法,比如说处理文件和端口之类的非内存资源。

      finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.

      finalize()在什么时候被调用?

      有三种情况
      1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
      2.程序退出时为每个对象调用一次finalize方法。
      3.显式的调用finalize方法

      除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因。

      理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。
分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc.zip

    Java是世界上最流行的...通过深入理解JVM的结构、`finalize`机制以及GC的工作方式,开发者能够更好地优化Java应用程序的性能,预防和解决内存问题。这不仅是Java程序员的基础知识,也是进阶为高级开发者的关键技能。

    Java中finalize()的用法

    Java 中 finalize() 的用法 Java 中的 finalize() 方法是垃圾回收器在回收对象时调用的第一个方法。...finalize() 方法是 Java 中的一种机制,用于释放对象占用的系统资源,但需要正确地使用和注意其调用机制和限制。

    final, finally, finalize的区别

    在Java编程语言中,"final", "finally", 和 "finalize" 这三个关键字有着截然不同的含义和用途,它们各自在程序设计的不同层面扮演着重要角色。深入理解这些概念对于编写高效、健壮的Java代码至关重要。 ### final ...

    c#中的非托管资源释放 (Finalize和Dispose)

    ### C#中的非托管资源释放 (Finalize和Dispose) 在深入了解`Finalize`与`Dispose`之前,我们首先需要理解两个基本概念:托管资源与非托管资源。 #### 托管资源与非托管资源 1. **托管资源**指的是由.NET运行时...

    垃圾回收finalize的用处(算法 演示)

    通过了解`finalize`和各种垃圾回收算法,我们可以更好地理解和优化Java程序的内存管理。但实际开发中,应尽可能减少对`finalize`的使用,转而采用更安全的try-finally结构或者使用`try-with-resources`语句(Java 7...

    Java中finalize方法使用.doc

    Java 中 finalize 方法使用 finalize 方法是 Java 编程语言中一个非常重要的方法,它与 Java 编程中的垃圾回收器有着紧密的关系。当一个对象变成一个垃圾对象的时候,如果此对象的内存被回收,那么就可以调用系统中...

    优秀Java程序员必须了解的GC工作原理

    GC的主要任务是自动管理内存,尤其是对象的分配和回收,以避免内存泄漏和资源浪费。在Java中,程序员通过`new`关键字创建对象,而对象的释放则无需手动操作,只要将对象的所有引用置为`null`,使其变为“不可达”,...

    java虚拟机中gc的基本原理 .docx

    例如,Sun JDK的HotSpot JVM提供了多种GC策略,包括默认的非增量GC和增量式GC。 增量式GC是一种优化策略,旨在减少GC过程对应用程序运行的影响。传统的GC执行时,程序会暂停运行,等待GC完成,这可能导致明显的性能...

    优秀的Java程序员必须了解GC的工作原理

    在Java中,GC通常使用有向图结构来记录和管理堆(heap)中的所有对象,以此来判断哪些对象是可达的,哪些是不可达的。当GC发现某些对象不再可达时,它们的内存空间就会被回收。 尽管GC的基本任务是明确的,但Java规范...

    从JVM的内存管理角度分析Java的GC垃圾回收机制.docx

    总的来说,Java的GC机制是一个复杂而重要的主题,理解其工作原理,掌握如何与之协作和优化,对于提升Java程序的性能和稳定性至关重要。开发者需要不断学习和实践,以便在实际项目中做出最佳的内存管理决策。

    rust-gc:用于Rust的简单跟踪(标记和清除)垃圾收集器

    锈-gc 用于Rust的简单跟踪(标记和清除)垃圾收集器 ... 放置在Gc类型必须实现Trace和Finalize 。 最简单的方法是使用gc_derive板条箱: use gc :: {Finalize, Gc, Trace}; #[derive(Trace, Finali

    简单理解Java的垃圾回收机制与finalize方法的作用

    `finalize()`方法是在对象被GC标记为可回收并准备释放之前调用的,提供了在对象被彻底删除前执行某些清理操作的机会。通常,当一个对象不再被任何引用可达时,GC会先调用其`finalize()`方法,然后在下一次垃圾回收时...

    04.GC要做的事情1

    GC(Garbage Collection)是Java虚拟机中一个非常重要的组件,负责回收Java堆和方法区中不再使用的对象,以避免内存泄露和溢出。那么,GC要做的事情是什么? 首先,GC需要确定哪些内存需要被回收。Java虚拟机中,...

    Java垃圾回收finalize()作用详解

    总的来说,Java的`finalize()`方法提供了一种在对象被垃圾收集器回收前进行额外操作的机会,但这应该谨慎使用,因为它的执行时间和效果都是不确定的。在设计程序时,优先考虑使用Java提供的自动资源管理机制,如`try...

    Java GC 专题

    Java GC有多种不同的实现,包括串行GC、并行GC、并发Mark Sweep (CMS) 和G1(Garbage-First)GC等。串行GC适合轻量级应用,它在一个单独的线程中运行,对性能影响较小。并行GC则在多个CPU核心上同时进行,提高了效率...

    白话说java gc垃圾回收.docx

    Java垃圾回收(GC)是Java语言的一大特性,它自动化地管理程序内存,使得开发者无需手动进行内存分配和释放,从而避免了C/C++等语言中常见的内存泄漏问题。GC通过智能地识别并回收不再使用的对象,确保内存的有效...

    「入门篇」初识JVM (下下) - GC.doc

    其中,垃圾收集(GC)主要针对的是堆和方法区。 【垃圾收集(GC)】 垃圾收集是JVM自动管理内存的过程,用于回收不再使用的对象所占用的空间,避免内存泄漏。GC主要关注的是堆和方法区,因为这两个区域存储的是线程...

    C#基础:Dispose()、Close()、Finalize()的区别详解

    本文将深入探讨三个关键的方法:`Dispose()`、`Close()`和`Finalize()`,以及它们在处理对象销毁时的区别。 首先,让我们从.NET内存管理和垃圾回收(Garbage Collection, GC)的基本概念开始。在.NET中,内存管理由...

    一篇文章教你深入理解Java垃圾收集(GC)机制.docx

    GC主要关注的是Java堆和方法区这两部分内存,因为它们是动态分配和回收的。 1. **对象可回收性的判断** - 引用计数算法:此算法简单直观,但无法处理循环引用问题,例如对象A引用对象B,B引用A,两者引用计数都...

    finalize.js:JavaScriptnode的垃圾收集器回调

    var finalize = require ( 'finalize' ) ; var obj = { x : 1337 } ; finalize ( obj , function ( ) { console . log ( this . x ) ; // this will print '1337' } ) ; global . gc ( ) ; // nothing will happen,...

Global site tag (gtag.js) - Google Analytics