`
qingBYqing
  • 浏览: 49498 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

关于垃圾回收的几个问题

    博客分类:
  • Java
阅读更多
一.为什么要清理

   为了回收程序不在使用的内存,垃圾回收器会负责释放对象占用的内存,在使用程序库时,把一个对象用完后就“弃之不顾”的做法是不安全的,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
0
分享到:
评论

相关推荐

    垃圾回收仿真分析

    垃圾回收的仿真 近几十年来,由于人类的滥砍、滥伐,无情的破坏我们的大自然,地球上能用的资产和能源逐渐地减少,环保团体发现如果我们不再注重保护环境,终有一天我们会失去地球这个美好的家园。所以近年来,环保...

    Java垃圾回收机制

    关于Java垃圾回收机制 垃圾收集的算法分析 垃圾回收的几个特点

    垃圾分类微信小程序.zip

    主要用于垃圾分类,微信小程序实现了下面几个功能: 1.文字搜索:根据文本搜索垃圾分类 2.拍照识别:根据图片识别出文本然后搜索垃圾分类 3.语音识别:根据语音识别出文本然后搜索垃圾分类 4.垃圾分类基础数据:...

    java垃圾回收以及jvm参数调优概述

    Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象...本文主要对java垃圾回收机制以及jvm参数等方面做个综述,也算是自己做开发这几年对这方面的一个总结。

    基于python毕业设计垃圾分类数据系统源码.zip

    垃圾分类的目的是提高垃圾的资源价值和经济价值,减少垃圾处理量和处理设备的使用,降低处理成本,减少土地资源的消耗,具有社会、经济、生态等几方面的效益。利用深度学习方法,基于python设计此垃圾分类系统。 ...

    几个页面垃圾的网页设计作业

    有多垃圾看看就知道了,博客类的吧,反正同学说尽量做的垃圾点,不然会被老师看出来的,哈哈(自己替换图片和改名字吧)

    论文研究-垃圾邮件过滤的贝叶斯方法综述.pdf

    目前,基于内容的垃圾邮件过滤问题是Internet安全技术研究的一个重点问题,将机器学习的相关方法应用于垃圾邮件的搜索和判定是进行大量垃圾邮件处理的有效方法。由于贝叶斯分类方法在垃圾邮件处理上表现出了很高的...

    垃圾邮件过滤的贝叶斯方法综述.pdf

    目前,基于内容的垃圾邮件过滤问题是Internet安全技术研究的一个重点问题,将机器学习的相关方法应用于垃圾邮件的搜索和判定是进行大量垃圾邮件处理的有效方法。由于贝叶斯分类方法在垃圾邮件处理上表现出了很高的准确...

    Java垃圾回收算法的简易模拟实现.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    基于java技术的智能垃圾分类小程序毕业设计(含论文)

    本论文首先对基于Android的智能垃圾分类系统进行了需求分析,从系统的建设目标、开发环境、设计流程、功能构建等几个方面进行系统的总体设计,使用Java语言设计了基于Android的智能垃圾分类系统软件,主要完成了照片...

    校园垃圾分类管理系统-毕业设计.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    垃圾邮件分类器

    能够识别垃圾邮件是一个二进制分类问题,因为邮件被分类为“垃圾邮件”或“非垃圾邮件”,别无其他。 同样,这是一个有监督的学习问题,正如我们知道要预测的那样。 我们将标记的数据集输入模型中,以供将来进行...

    称重传感器在垃圾回收中的重要应用

    在国外称重传感器在垃圾回收中的工作是怎样运行的?而且它的效率如何呢?它采用900M防拆电子标签,标签安装在运输车辆的前挡风玻璃上面,垃圾运输车辆从城市垃圾中转站装运垃圾,运输车辆再将垃圾运到垃圾处理场进行...

    API for Boehm Garbage Collector DLL

    C++的自动垃圾回收库早就有了几个,商业和非商业的都有。不过delphi的好像就没见过了。 最近在搜索delphi自动垃圾回收技术的时候在borland的网站上看到了在delphi中使用自动垃圾回收的方法。用过一个接口文件,采用...

    C/C++中几种经典的垃圾回收算法

    1.引用计数算法 ...而它的另外一个优势在于空间上的引用局部性比较好,当某个对象的引用计数值变为0时,系统无需访问位于堆中其他页面的单元,而后面我们将要看到的几种垃圾回收算法在回收前都回遍历所有的存

    go手册,Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能

    它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。Go是静态类型的语言,它的类型系统没有层级。因此用户不...

    jvm内存管理和垃圾回收

    很久之前就一直在学习JVM,但是一直也没有好好的总结,最近终于有了空闲,将之前学习的内容整理成了一个PPT。 也希望大神们可以批评指正。 ppt中主要包含下面几部分: Java内存模型 内存分配策略 分代垃圾收集...

    简单谈谈PHP的垃圾回收机制

    1、每一个变量定义时都保存在一个叫zval的容器里面,这里面包含了数量的类型和和值,还包含了一个refcount(理解为存在几个变量个数)和is_ref(理解为是否为引用变量)两个额外信息,当变量被引用一次refcount就会+...

    Java 垃圾回收机制概念梳理

    牢记了这点之后,我们再来深入地了解下这个被称为“垃圾回收”的自动化内存回收在JVM中到底是如何实现的。  手动管理内存  在介绍现代版的垃圾回收之前,我们先来简单地回顾下需要手动地显式分配及释放内存的...

    传感技术中的称重传感器在垃圾回收中的重要应用

    在国外称重传感器在垃圾回收中的工作是怎样运行的?而且它的效率如何呢?它采用900M防拆电子标签,标签安装在运输车辆的前挡风玻璃上面,垃圾运输车辆从城市垃圾中转站装运垃圾,运输车辆再将垃圾运到垃圾处理场进行...

Global site tag (gtag.js) - Google Analytics