Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16045
  • 博文数量: 17
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-10 01:17
文章分类

全部博文(17)

文章存档

2011年(2)

2010年(15)

我的朋友
最近访客

分类: Java

2010-09-16 15:27:40

C/C++Pascal和其他几种多种用途的编程语言中,开发者有责任在内存管理上发挥积极的作用。例如,如果你为一个对象或数据结构分配了内存,那么当你不再使用它时必须释放掉该内存。

      在 Java 中,当你创建一个对象时,Java 虚拟机(JVM)为该对象分配内存、调用构造函数并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时),JVM 通过垃圾回收器将该对象标记为释放状态。


1、垃圾收集是一种从无用对象回收其所占用的内存,并使回收的内存能够被再次利 用的机制。

2、无用对象是指它不能被程序中处于活动状态的部分的引用。

3、垃圾收集处于低优先级的线程内,当可用内存较少时运行,但不能保证何时运行。

4、不可能强制运行垃圾回收线程,只能算是建议,但是调用语句System.gc()有可能激活垃圾收集程序.

5、在垃圾回收机制中,无法保证对象被垃圾回收的顺序,也无法保证 finalize() 方法被调用的顺序。

6、环形引用关不能阻止对象被回收.:

class A

{

B b;

}

class B

{

  A a;

}

执行下面的程序:

A  a=new A();

B  b=new B();

a.b=b;

b.a=a;

最后这二个对象都会被回收.

7、我们可以设置引用变量值为null,来暗示垃圾收集线程来回收这引用变量的对象所占用的内存。如果该对象属于某监听器对象,那么,应该首先将这个监听器注销掉,否则该对象可能依然不能被垃圾回收。

8、所用对象都有一个finalize方法,他是从Object类继承下来的,注意j2me中不可用.

9、什么情况下垃圾回收线程会启动?一般规则是:当存在无用对象时,将启用垃圾收集线程,对无用对象占用的内存进行释放。什么是无用对象?一般规则为:没有引用指向的对象称为无用对象.

10、垃圾回收线程的启动时间由虚拟机内嵌算法来进行调度,程序员无法直接调度它,它的运行只有二种情况:系统在运行过程中处于空闲状态和内存资源使用不足。

11、无用对象判断方法补充:沿着对象的引用的被饱含关系追溯不到根对象或活动线程时,则这个对象被称为无用对象.

如下面所示,对象ABCDE不是无用对象,而G,H是无用对象.其中main代表根对象.

main

A

C

D

B

E

G

H

12、垃圾回收线程管理的内存区域:在JAVA语言中,内存的分配与其他的语言也是一样的,分为代码区、数据区、堆区、栈区,垃圾回收能够管理的内存区域仅限于堆区.在类中声明的静态数据内存分配在数据区中,因此,静态数据不会被垃圾回收线程回收.
    
       在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行
finalize()。如果在 Applet 或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize()

 

    其次,除非垃圾回收器认为你的 Applet 或应用程序需要额外的内存,否则它不会试图释放不再使用的对象的内存。换句话说,这是完全可能的:一个 Applet 给少量的对象分配内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了。

 

    显然,如果你为某个对象定义了finalize() 方法,JVM 可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。调用System.gc() 也不会起作用,因为它仅仅是给 JVM 一个建议而不是命令。

 

finalize() 有什么优点呢?

 

    如果finalize() 不是析构函数,JVM 不一定会调用它,你可能会疑惑它是否在任何情况下都有好处。事实上,在 Java 1.0 中它并没有太多的优点。

 

    根据 Java 文档,finalize() 是一个用于释放非 Java 资源的方法。但是,JVM 有很大的可能不调用对象的finalize() 方法,因此很难证明使用该方法释放资源是有效的。

 

      Java 1.1 通过提供一个System.runFinalizersOnExit() 方法部分地解决了这个问题。(不要将这个方法与 Java 1.0 中的System.runFinalizations() 方法相混淆。)不象System.gc() 方法那样,System.runFinalizersOnExit() 方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的finalize() 方法。

 

    正如你可能猜测的那样,通过调用System.runFinalizersOnExit() 方法强制垃圾回收器清除所有独立对象的内存,当清除代码执行时可能会引起明显的延迟。



阅读(503) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~