在一个系统中,如何判断一个java对象没有被其他对象使用到?

wyj8010 2005-11-23 04:06:18
在一个系统中,如何判断一个java对象没有被其他对象使用到?也就是说没有任何其他对象引用这个对象?
...全文
677 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyj8010 2005-11-27
  • 打赏
  • 举报
回复
to gtlang78(), 谢谢,我已经测试成功。
但我还有个问题,就是每次当某个对象的引用个数为0时,必须强制调用一下gc,否则,
referece不能被回收, 有没有其他方法可以不用显示地调用gc。

SoftReference和WeakReference是否可以?

另外,假如可以,那么用这种方式来实现缓存,不只是否合适,是不是效果不太好,因为总有个线程在做死循环。

我知道可以自定义数据结构来实现一个缓存,但那种方式需要程序员自己调用取和放操作,
所以,我考虑想做成类似于webLogic存放ejb的对象池,这些对象的生命周期由容器或后台完成,
而程序员只关心怎么用,不用管他的生命周期。

谢谢!

也希望大家能共同讨论。

plovej 2005-11-27
  • 打赏
  • 举报
回复
关注~~~
sjjf 2005-11-27
  • 打赏
  • 举报
回复
mark
niko7 2005-11-27
  • 打赏
  • 举报
回复
关注
aaa2003gf 2005-11-24
  • 打赏
  • 举报
回复
这个??????
楼上好强,和和
pauliuyou 2005-11-24
  • 打赏
  • 举报
回复
在类里先写方法public void finalize() {
System.out.println("我是" + this.getClass().getName() + "正在死");

}强制System.gc()一下,看看谁死了 就没有被使用了
gtlang78 2005-11-24
  • 打赏
  • 举报
回复
使用 Reference 和 ReferenceQueue 可以做到.
-----------------------------------------------------
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.util.*;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ReferenceTest {
public static void main(String[] args){
final List integerList = new ArrayList();
final List refList = new Vector();
final Map referentNameMap = new Hashtable();
final ReferenceQueue refQueue = new ReferenceQueue();

new Thread() {
public void run() {
while (true) {
try {
Reference ref = refQueue.remove();
String referentName = (String) referentNameMap.get(ref);
ref.clear();
refList.remove(ref);
referentNameMap.remove(ref);

System.out.println("已经没有指向整数对象" + referentName + "的引用了.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();

JButton gcBtn = new JButton(new AbstractAction() {
{ putValue(NAME, "随机删除一些整数对象"); }

public void actionPerformed(ActionEvent e) {
Random random = new Random();
for (int i = 0; i < 100 && integerList.size() > 0; i++) {
int index = random.nextInt(integerList.size());
integerList.remove(index);
}
System.gc();
}
});

JButton genBtn = new JButton(new AbstractAction() {
{ putValue(NAME, "产生一些随机的整数对象"); }

public void actionPerformed(ActionEvent e) {
Random random = new Random();
for (int i = 0; i < 100; i++) {
final Integer t = new Integer(random.nextInt());
integerList.add(t);
PhantomReference ref = new PhantomReference(t, refQueue);
referentNameMap.put(ref, "[" + t + "]");
refList.add(ref);
}
}
});

JFrame f = new JFrame();
JPanel p = new JPanel();
p.add(genBtn);
p.add(gcBtn);
f.getContentPane().add(p, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Elegantlzu 2005-11-24
  • 打赏
  • 举报
回复
如果可以在类的内部添加一个方法,或许可以
yeyu710 2005-11-23
  • 打赏
  • 举报
回复
不能够,建议你看看《java高质量编码》。里面说的很清楚,java的GC机制已经做得很好了,但是要判断一个对象是否还在被引用是何其难啊。

在《java高质量编码》详细说了GC机制的判断方法,但都只能是一些简单的。

上面这些只是我在看了这本书后留下的印象,建议楼主去看看!
wyj8010 2005-11-23
  • 打赏
  • 举报
回复
我想应该可以吧,webLogic中的对象池不是可以回收不再使用的ejb吗?

当然,可以让使用者显示的释放这个对象。

那么我还想问一下,怎么样知道某个对象被多少个其他对象所引用?也就是这个对象的被引用个数
shine333 2005-11-23
  • 打赏
  • 举报
回复
因为这个判断,其实就是JVM中的GC算法
conquer2004 2005-11-23
  • 打赏
  • 举报
回复
什么意思?
今天刚考软件测试,难道是用软件测试里面的判断点的活性的算法?
shine333 2005-11-23
  • 打赏
  • 举报
回复
用非Java的方法,即使不是不可能也是非常非常难的

问个问题,为何要判断这个?
wyj8010 2005-11-23
  • 打赏
  • 举报
回复
用本地方法可以吗? 用c或c++能做到吗?
bixuehui 2005-11-23
  • 打赏
  • 举报
回复
这个问题太难了。
myhotsun 2005-11-23
  • 打赏
  • 举报
回复
真是长学问啊
ypdarling 2005-11-23
  • 打赏
  • 举报
回复
还是楼上的有学问啊,量子力学都出来了
佩服!
shine333 2005-11-23
  • 打赏
  • 举报
回复
不能,

这个有点像量子力学测不准原理,我们无法在不引用这个对象的情况下对其进行测量,而对其测量必然导致这个对象肯定被引用
ypdarling 2005-11-23
  • 打赏
  • 举报
回复
如果没有其他对象引用这个对象引用这个对象,那么这么对象已经是垃圾了
存不存在都一定。
捏造的信仰 2005-11-23
  • 打赏
  • 举报
回复
Sun以为没有人会问这种问题。

62,624

社区成员

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

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