我对垃圾收集器在Java中的工作方式有一个大致的了解,但是我销毁对象的原因不是因为我关心释放内存,而是因为功能。我可以用一个例子更好地解释:
假设我正在制作涉及金钱的游戏。当某人Money
从地面上捡起一个物体时,我想调用该物体的addTo
方法,该方法涉及为该人的钱包添加一个值。
public class Money {
/** The value of this object. */
private final int value;
// constructor
public Money(double x) {
this.value = x;
}
// Should be called when a Person picks up this object.
public void addTo(Person bob) {
bob.addToWallet(this.value);
}
// MAIN METHOD
public static void main(String[] args) {
Person bob = new Person();
Money dollar = new Money(1.00);
dollar.addTo(bob); // bob finds $1.00
}
}
之后dollar
发现,我不希望别人能够把它捡起来。换句话说,我不希望自己或任何其他程序能够不经意间拨打电话:
dollar.addTo(alice);
因此,在Bob拿起钱后,它的价值便被添加到他的钱包中,不再需要具有该价值的对象表示。不是我在乎对象正在使用的内存,而是我不希望该对象在程序的其他地方意外使用。dollar
除了设置,我该如何销毁dollar = null;
?
您根本不应该考虑垃圾回收。由JVM决定何时可以进行垃圾回收以及99%的时间,如果您负责任地进行编程,则根本不需要考虑这一点。
回答我..“如何在程序的其他地方意外使用该对象”?
答案是,不可能。本地引用一直存在到您的main方法结束为止,并且不再存在。除非您存储对它的引用,否则无法对其进行引用。
随着程序的增长,最好暂时存储对它的引用。您需要用一个对象来表示“地面”的概念。由于您描述的功能是基本功能,因此您可以仅使用Collection
example的任何内置实现List
。
List<Money> floorMoney = new LinkedList<Money>();
floorMoney.add(new Money(1.00));
当您将地板上的钱与关联时,Person
您就会将其从地板上删除。
Money dollar = floorMoney.get(0); // how you access elements may vary
floorMoney.remove(dollar);
dollar.addTo(bob);
现在,除非您dollar
在addTo
实现中的某处存储了引用,否则该Money
对象将被放弃,并在以后进行GC处理。
对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用 new 操作符为对象分配内存。不过, 在清除对象时,由系统自动进行内存回收,不需要用户额外处理。这也是 Java 语言的一大特色,某种程度上方便了程序员对内存的管理。 Java 语言的内存自动回收称为 垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM 用于释放那些
问题内容: 我在接受以下采访时遇到了这个问题: 如何在Java中销毁对象? 答案应该是e? 如果e不在那里怎么办?然后 ?显然,c不是答案。a和b将为整个应用程序执行gc(问题需要一个对象)。我认为这是d,因为finalize()刚好在gc之前被调用(但是是否有必要在finalize gc之后被调用?)还是我错了?您必须在那里回答这个问题吗? 问题答案: 答案E是正确答案。如果E不存在,您将很快用
本文向大家介绍Java中对象的销毁方法分析,包括了Java中对象的销毁方法分析的使用技巧和注意事项,需要的朋友参考一下 本文较为详细的分析了Java中对象的销毁方法。分享给大家供大家参考。具体分析如下: Java中的基本数据类型变量和对象的名称引用变量如定义在方法中,都为局部变量。但对象本身不一定是局部生命周期。如函数外存在其他对该对象的引用变量,则该对象的生命周期延伸至该其他引用变量所在的块。
如果一个具有静态存储持续时间的对象的构造函数的完成或动态初始化在另一个对象的完成之前被排序,则第二个对象的析构函数的完成将在第一个对象的析构函数的启动之前被排序。[注:此定义允许并发销毁。-结束注] 第二个和第一个的完成析构函数可能在不同的线程中吗?
问题内容: 我公司的员工需要通过我编写的程序来修改SQL Server数据库中的数据。该程序首先使用Windows身份验证,我要求DBA授予该特定用户对该数据库的写访问权限。 他们不愿意这样做,而是给了 我的 Windows用户帐户写权限。 因为我信任这个人,但不足以让他在打开会话的情况下工作90分钟,所以我只向程序添加一个登录提示,询问用户名和密码的组合,然后使用它登录SQL Server。我将
销毁 Destroy 在不需要使用iScoll的时候调用iScroll实例的公共方法destroy()可以释放一些内存。 myScroll.destroy(); myScroll = null;