Cappuccino : Memory Leak & SoftReference

Patrick_DK 2002-12-17 07:43:54
// 好冷啊~煮杯Cappuccino给大家尝尝,下面是偶整理的一点小东西
1. Java也存在内存泄漏。
2. Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC(垃圾回收器)决定和执行的。
3. 在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的。
4. 回收对象的根本原则就是该对象不再被引用,但是Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。
5. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
6. 在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语言上保证,任何对象都是可达的,所有的不可达对象都由GC管理。
7. 根据JLS定义,System.gc()函数不保证GC一定会执行。
8. Vector v = new Vector(10);
for (int i=1;i<100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}
// 此时,所有的Object对象都没有被释放,因为变量v引用这些对象。
9. 根据JLS,JVM保证调用finalize()函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。另外,规范还保证finalize函数最多运行一次。通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接。
10. Java程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize()函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅依靠finalize()来释放资源。
11. Java2增强了内存管理功能, 增加了一个java.lang.ref包,其中定义了三种引用类。这三种引用类分别为SoftReference、WeakReference和PhantomReference。通过使用这些引用类,程序员可以在一定程度与GC进行交互,以便改善GC的工作效率。这些引用类的引用强度介于可达对象和不可达对象之间。它们的引用强度由小到大如下所示:
不可达对象 --> PhantomReference --> WeakReference --> SoftReference --> 可达对象
12. Soft Reference的主要特点是据有较强的引用功能。只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引用对象还能保证在Java抛出OutOfMemory 异常之前,被设置为null。它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory。
13. 如果程序允许,尽早将不用的引用对象赋为null。这样可以加速GC的工作。
14. 尽量少用finalize()函数。
15. SoftReferenceTester.java Source Codes,测试一下SoftReference的效果。
package org.jfml.cappuccino;


import java.lang.ref.SoftReference;
import java.util.Vector;


public class SoftReferenceTester
{
public static Vector storage = new Vector();
public static SoftReference storageWithSR =
new SoftReference(new Vector());

public static void callWithoutSoftReference()
{
MartialBase[] mbs = new MartialBase[9999];

for (int i = 0; i < mbs.length; i++)
{
System.out.println
(
"Creating No." + i + " MartialBase object"
);
mbs[i] = new MartialBase();
}
}

public static void callWithSoftReference()
{
//MartialBase[] mbs = new MartialBase[9999];
SoftReference[] mbs = new SoftReference[9999];

for (int i = 0; i < mbs.length; i++)
{
System.out.println
(
"Creating No." + i + " SoftReference(MartialBase) object"
);
//mbs[i] = new MartialBase();
mbs[i] = new SoftReference(new MartialBase());
}
}

public static void main(String[] args)
{
SoftReferenceTester.callWithoutSoftReference(); // No.1 Test
//SoftReferenceTester.callWithSoftReference(); // No.2 Test
}
}


class MartialBase
{
String name;

B2[] b2s = new B2[100];

public MartialBase()
{
for (int i = 0; i < b2s.length; i++)
{
b2s[i] = new B2();
}
}
}


class B2
{
String serialNumber;

Bomb[] bombs = new Bomb[100];

public B2()
{
for (int i = 0; i < bombs.length; i++)
{
bombs[i] = new Bomb();
}
}
}


class Bomb
{
}
...全文
131 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anubis 2003-01-17
  • 打赏
  • 举报
回复
最近你跑那里去了
Patrick_DK 2003-01-14
  • 打赏
  • 举报
回复
http://www-900.ibm.com/developerWorks/cn/java/j-refs/index.shtml
biti_9512207 2002-12-20
  • 打赏
  • 举报
回复
rui
coolskeeter 2002-12-20
  • 打赏
  • 举报
回复
嗯。
想想。。。
qxjavajava 2002-12-18
  • 打赏
  • 举报
回复
收藏!
hystream 2002-12-18
  • 打赏
  • 举报
回复
up
xmvigour 2002-12-18
  • 打赏
  • 举报
回复
阅~
追梦 2002-12-18
  • 打赏
  • 举报
回复
我来收分。
希偌 2002-12-17
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧