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
{
}
...全文
147 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
资源下载链接为: https://pan.xunlei.com/s/VOYz5FXj0qylrALOE1ljlUp6A1?pwd=b39x Cappuccino是一款图形界面(GUI)智能代理工具,只需简单指令,就能控制电脑完成繁琐任务。AI会生成详细任务计划并执行,不同于其他依赖解析图像元素或浏览器界面的方案,它基于桌面屏幕实现纯视觉交互,完全依靠模型与提示词的有效性,不依赖浏览器等第三方库(避免解析过程丢失空间关联信息),开发者还可针对特定任务微调模型,提升软件控制能力。你可直接调用API快速上手,也能在本地服务器部署大语言模型(LLM),保障安全性,还能通过Python脚本或图形界面客户端(cappuccino-client)发送控制指令。 目前支持Windows、Mac系统部署,因系统快捷键与操作方式差异,体验可能不同,后续将推进更多系统适配。 支持调用厂商API或本地部署LLM,本地部署需使用兼容OpenAI的API服务,推荐参考官方教程用vLLM部署。 在待控制电脑上操作:1. 克隆代码仓库;2. 安装依赖;3. 启动服务器,控制台会显示本地IP(如示例192.168.0.100)与随机生成的令牌。 建议在另一设备发起网络请求(避免影响被控电脑操作),也可在被控端操作: 分为模型、服务器、客户端三部分: 图形界面代理细分为四模块: 支持经测试能较好完成代理功能的模型,可灵活替换同能力模型(如规划器可选小参数模型)。 我们期待更多人关注或加入项目,进一步完善系统,打造适配本地部署、支持更多软件操作的工具。

62,630

社区成员

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

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