一.为什么要清理
为了回收程序不在使用的内存,垃圾回收器会负责释放对象占用的内存,在使用程序库时,把一个对象用完后就“弃之不顾”的做法是不安全的,java作为安全性较高的一种高级语言内置了专门的垃圾回收机制来负责收回无用对象占用的内存资源。
要清楚垃圾回收工作方式首先了解下对象在堆和栈存储形式:
堆(Heap):存储对象实例包含对象的实例的属性值,属性类型和对象本身的类型标记(并 不保存对象的方法)
栈(堆栈)(Stack): 存储基本数据类型,指令代码(包过对象方法),常量,对象句柄(对象引用的地址)等。
对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的位置,便于找到该对象实例。
它们的区别:
Java 的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。"
栈的优势:存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 ”
所以说: 垃圾回收System.gc()是针对堆Heap的,而栈因为本身是FILO协议:first in, last out. 先进后出,能够自动释放。 这样就能明白到new创建的,都是放到堆Heap!
二.何时清理
java 的垃圾回收器 是不定时的,也许你会发现,只要内存没有频临存储空间用完那一刻,对象占用的空间就总也得不到释放。如果程序执行结束,并且垃圾回收器一直都没有释放你创建的任何对象的存储空间,当随着程序的退出,那些RAM资源也全部交给了操作系统。 其实这样做是恰当的,因为你要知道垃圾回收本身也要使用内存开销,如果在没必要(内存资源充足)使用它来工作的情况下,又何必多此一举呢?
三.finalize()的使用:
垃圾回收器只知道释放那些由new 分配的内存,所以它不知道该如何释放该对象的“特殊(即通过new 创建对象以外的方式创建对象分配了内存:比如在使用本地方法的情况下,非java代码中出现的对象如:c++)”内存。为了应对这种情况,java 允许在类中定义一个名为finalize()的方法。它的工作原理是这样的:一旦垃圾回收器准备释放对象占用的存储空间,将在这之前调用该对象finalize(),并在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存。所以要是使用了finalize()就意味着在垃圾回收时刻做了一些垃圾回收器无法回收对象特殊内存的清理。
finalize()在以下情况下被调用:
1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
2.程序退出时为每个对象调用一次finalize方法。
3.显式的调用finalize方法
除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因.
分享到:
相关推荐
首先,建立垃圾分类的投入和收益模型,通常包括以下几个步骤: 1. 投入分析:考虑垃圾分类系统中的成本,例如初期设施建设(垃圾处理中心、分类设施)、运营维护费用(垃圾收集车、人员培训、宣传费用)、以及处理...
然而,在实际操作过程中,垃圾分类回收还存在诸多问题,具体可以归纳为以下几个方面: 一、民众意识问题 民众是垃圾分类回收的主体,但目前许多民众对垃圾分类的意义、标准和方法认识不足。尽管一些城市已经开展了...
系统设计主要包括以下几个关键部分: 1. 数据采集:通过集成多种传感器(如重量传感器、图像传感器等),实时监测垃圾的种类、数量以及投放情况。重量传感器可以测量垃圾的重量,而图像传感器则能识别垃圾的类型,...
基于这一特性,Java虚拟机将内存划分为几个不同的区域: - **新生代**(Young Generation):新创建的对象都放置在这里。新生代又被细分为Eden区和两个Survivor区(Survivor0和Survivor1)。 - **老年代**(Old ...
这个例子展示了如何运用体积计算来解决实际问题,同时突显了垃圾分类在城市管理和环境规划中的数学应用。 总的来说,垃圾分类与数学的结合,不仅教会我们如何在生活中实施有效的垃圾管理,还让我们看到数学在解决...
浅谈Java垃圾回收机制.doc文档可能会涵盖以下几个关键点: 1. **对象生命周期**:当一个对象被创建后,它会在内存中占据一定的空间。如果对象不再被任何引用指向,那么这个对象就成为垃圾。 2. **垃圾收集器**:...
在杭州天地试验学校,垃圾分类依据垃圾的性质和可能的处理方式,将垃圾分为几大类:可回收垃圾、食堂垃圾、有毒有害垃圾、不可回收垃圾和绿化带垃圾。可回收垃圾主要包括纸类、塑料、金属和玻璃等,这些物品经过适当...
使用Flexsim软件建立模型,分为以下几个步骤: - **Step 1: 设计模型实体** 首先,定义了模型中的关键元素,如Source、Queue、Separator、Conveyor、FlowNode、Reservoir、Rack、Crane和Transporter。 - **Step...
苏州市生活垃圾分类知识竞答主要涵盖了以下几个关键知识点: 1. 垃圾分类实施时间:苏州在2020年6月1日开始实施垃圾分类。 2. 垃圾分类标准:苏州的垃圾分类标准分为厨余垃圾、其他垃圾、有害垃圾和可回收物四类。...
针对目前垃圾分类存在的问题,可以从以下几个方面着手改进。首先,增强公众的环保意识和责任感,通过媒体宣传、教育活动等多种形式,让垃圾分类的理念深入人心。其次,优化垃圾分类设施,简化分类流程,让居民能更...
其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...
具体来说,Java中的垃圾回收过程涉及以下几个关键步骤: 1. **标记(Marking)**:首先,垃圾回收器会从GC Roots出发,通过可达性分析算法遍历所有可达对象,并将其标记为可达。 2. **清扫(Sweeping)**:在标记...
根据垃圾分类处理的特点,数学建模可以分为以下几个方面: 一、垃圾分类模型 垃圾分类模型是指根据垃圾的性质和特点对其进行分类的数学模型。这种模型可以根据垃圾的类型、数量、分布等因素对其进行分类,从而制定...
### 垃圾分类回收研究现状及其关键问题 #### 国内垃圾分类现状 中国的垃圾分类回收工作面临着严峻的挑战。根据2008年的数据,全国655个城市中约有三分之一的城市面临严重的垃圾处理问题,年垃圾总量达到了1.52亿吨...
"C++实现的垃圾回收管理类"是一个设计用于解决内存泄漏问题的高级工具。内存泄漏是当程序员使用`new`关键字分配了内存,但忘记或者未能通过`delete`来释放它时发生的问题。这会导致程序占用的内存持续增长,最终可能...
- 分代垃圾回收是根据对象存活时间的不同将对象分成几代,年轻的对象在一次垃圾回收中存活下来的概率较低,而年长的对象则相反。这种策略能够提高垃圾回收的效率。 - 增量式垃圾回收将垃圾回收过程分解成许多小步骤...
垃圾分类的过程通常分为以下几个阶段: 1. **分类储存**:在家庭或工作场所,公众需要将不同类型的垃圾分别储存。例如,可回收物如纸张、塑料瓶、金属罐等应与厨余垃圾、有害垃圾(如电池、荧光灯管)及其它垃圾...