终结处理和垃圾回收(1)

之前一直不了解Java的垃圾回收原理,最近看了Java编程思想,有点想法,做做笔记。

首先,我们都了解初始化的重要性,但是常常会忘记同样也重要的清理工作。Java有垃圾回收器负责回收无用对象占用的内存资源。但是也有特殊情况:假定你的对象(并非使用new)获得一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道如何释放该对象的这块特殊内存。为了应对这种情况,Java允许在类中定义一个名为finalize()方法。

Java的finalize()不同于C++里的析构函数:

1.对象可能不被垃圾回收,

2.垃圾回收并不等于析构。

所以在Java中你不需要某个对象之前,如果必须执行某些动作,那么必须手动创建一个方法去做这些操作。

那么finalize9)真正用处是什么?这里引出第三点:

3.垃圾回收只与内存有关。

也就是说,使用垃圾回收器唯一的原因是为了回收程序不再使用的内存。之所以要有finalize(),是由于再分配内存时可能采用了类似C语言的做法,而非Java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。本地方法目前只支持C和C++,但是它们可以调用其他语言写的代码,所以实际上可以调用任何代码。在非Java代码中你也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。而这些需要在finalize()中用本地方法调用它。

所以通常我们的“清理”工作并不能指望finalize()方法。

时间: 2024-10-14 18:00:54

终结处理和垃圾回收(1)的相关文章

12-JAVA清理_终结处理和垃圾回收

导论: 将一个对象初始化后就"弃之不顾"的做法并非总是安全的.虽然java用垃圾回收器回收无用对象占用的内存资源.但也有特殊情况, 假定对象并非使用new获得了一块"特殊"的区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以他不知道该怎样释 放这块"特殊"的内存. 1.finalize() 此方法出现的原因:回收除以new方法创建对象方式以外的方式分配的内存 为了应对上面的那种情况,java允许在类中定义一个名为finalize()的方

终结 finalize()和垃圾回收(garbage collection)

1.为什么要有finalize()方法? 假定你的对象(并非使用new)获得了一块"特殊"的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以他不知道该如何释放该对象的这块"特殊"内存,为了应对这种情况,java 允许在类中定义一个finalize()的方法. protected void finalize(){ } 2.finalize()方法在何时调用? 一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次

垃圾回收GC:.Net自动内存管理 上(三)终结器

垃圾回收GC:.Net自动内存管理 上(三)终结器 垃圾回收GC:.Net自动内存管理 上(一)内存分配 垃圾回收GC:.Net自动内存管理 上(二)内存算法 垃圾回收GC:.Net自动内存管理 上(三)终结器 前言 .Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述.同时,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 终结器 GC提供了另外一个能

垃圾回收GC:.Net自己主动内存管理 上(三)终结器

垃圾回收GC:.Net自己主动内存管理 上(三)终结器 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(三)终结器 前言 .Net下的GC全然攻克了开发人员跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包括很具体的内在算法描写叙述.同一时候,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 终结

垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)

来源 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般有如下几种: 1.手动管理:C,C++ 2.计数管理:COM 3.自动管理:.NET,Java,PHP,GO- 但是,手动管理和计数管理的复杂性很容易产生以下典型问题: 1.程序员忘记去释放内存 2.应用程序访问已经释放的内存 产生的后果很严重,常见的如内存泄露.数据内容乱码,而且大部分时候,

CLR垃圾回收的设计

CLR垃圾回收的设计 作者: Maoni Stephens (@maoni0) - 2015 附: 关于垃圾回收的信息,可以参照本文末尾资源章节里引用的垃圾回收手册一书. 组件架构 GC包含的两个组件分别是内存分配器和垃圾收集器.内存分配器负责获取更多的内存并在适当的时候触发垃圾收集.垃圾收集器回收程序中不再使用的对象的内存. 有多种方法调用垃圾回收器,例如人工调用GC.Collect或者当终结线程在接收到表示低内存的异步通知时(调用). 内存分配器的设计 内存分配器由执行引擎(EE)的内存分配

你不得不知道的-垃圾回收机制及析构函数原理解析

前言 当学习到Web API中摸索原理时,对于其中有关垃圾回收只是有点印象并未深入去了解其原理并且对索引器用的也很少,所以利用放假期间好好回顾下已经忘记或者遗漏的知识,温故而知新大概就是这道理吧,虽然园子中关于这两者的文章也是多不胜数,但笔者也有自己独特的见解. 垃圾回收机制 引言 我们知道.NET Framework中的对象是创建在托管堆中的,但是像C.C++等其他底层语言中的对象是创建在非托管堆中的,所以在这类语言中就会出现编程人员忘记去释放已经没有用的对象,同时编程人员也可能会去试图访问已

.Net中的垃圾回收

当某线程触发GC时,任何线程不能再访问任何的对象. 在GC执行时,可能会修改对象的地址. GC执行时,大多使用劫持法,将所有的线程挂起. 对于含有Loop,且Loop内不再调用其它方法时.会生成一个编译时表.当线程的指针指令执行到该处时,会认为到达了一个安全点,线程可以被挂起. 对于其它方法,GC会劫持线程.修改线程堆栈,使其正在执行的方法返回时指向一个CLR内一个特例函数,使得在方法返回时挂起. 当方法慢时,CLR会等待250ms,然后再次检测线程是否为安全点/可被劫持.该过程一直持续到所有线

JavaScript 之垃圾回收和内存管理

JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.而在 C 和 C++ 之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源. 在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理.这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间