hongrenldd 2008-06-26 15:02
浏览 154
已采纳

java变量作用域完了是不是就可以垃圾回收

public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakHashMap ws = new WeakHashMap();
// {
// String lu = new String("sb");
// ws.put(lu, "Afka Liu");
// }

    initHash(ws);
    System.gc();
    System.out.println(ws.get("sb"));
}
public static void initHash(WeakHashMap<String, String> ws) {
    String lu = new String("sb");
    ws.put(lu, "Afka Liu");
}

}

打印出来的值是 null

public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakHashMap ws = new WeakHashMap();
{
String lu = new String("sb");
ws.put(lu, "Afka Liu");
}

// initHash(ws);
System.gc();
System.out.println(ws.get("sb"));
}
public static void initHash(WeakHashMap ws) {
String lu = new String("sb");
ws.put(lu, "Afka Liu");
}
}

打印出来的值是Afka Liu

这个例子先new了一个String,这样就没有常量池的引用指向这个new出来的String对象,然后将它put到WeekHashMap中,如果没有lu的强引用,WeekHashMap中get出来的就应该是null。但是第二种方法get出来的不是null,但是lu已经出了作用域,生命周期也已经结束。第一种和第二种在垃圾回收上有什么区别?
[b]问题补充:[/b]
你说的我清楚,我也只是建议回收,可是在我的eclipse里跑了几十次都是我提问的结果,如果能得到您给的结果,那就没有什么问题了.

  • 写回答

1条回答 默认 最新

  • llade163 2008-06-26 19:57
    关注

    跑了一下代码,两个测试结果都是null哦。得不到你要第二个结果。

    顺便提一下。System.gc(); 调用之后System.gc(); 不一定马上运行哦。只是说:

    [quote]
    调用此方法意味着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制从方法调用中返回时,虚拟机已经尽最大努力回收了所有丢弃的对象。
    [/quote]

    对象是否被回收是不被保证的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分