0 0

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

public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakHashMap<String, String> ws = new WeakHashMap<String, String>();
// {
// 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<String, String> ws = new WeakHashMap<String, String>();
{
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");
}
}

打印出来的值是Afka Liu

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

1个答案 按时间排序 按投票排序

0 0

采纳的答案

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

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

引用

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



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

2008年6月26日 19:57

相关推荐

    黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构

    ### 黑马程序员Java基础教学知识点详解 #### 一、变量的作用域与生命...以上内容涵盖了Java基础教学中的关键概念,包括变量作用域、循环结构、流程控制以及内存管理的基本原理,是学习Java编程不可或缺的基础知识。

    JAVA程序设计课件-变量的作用域.pptx

    \n\n总之,理解并熟练掌握JAVA中的变量作用域是成为一名合格的JAVA程序员的基础,也是OCJA认证考试的关键内容之一。通过深入学习和实践,可以有效地提升编程技能,为未来的JAVA开发工作打下坚实的基础。

    Java变量和对象的作用域

    Java变量和对象的作用域是编程时非常重要的概念,它们决定了变量和对象的可见性和生命周期。在Java中,作用域由代码中的大括号 `{}` 定义,这被称为语句块。一旦变量或对象在某个作用域内声明,它们就只能在该作用域...

    Java垃圾回收详解

    - 从方法中返回,使得该方法中的局部变量超出作用域。 一旦对象的引用被销毁或不可达,即没有任何引用指向该对象时,该对象就成为了垃圾收集的目标。 #### 垃圾回收算法 常见的垃圾回收算法包括但不限于标记-清除...

    java垃圾回收技术,面试会问

    - **栈上创建**:原始数据类型的局部变量等,它们的内存会在栈上创建,并且当程序退出作用域时,这些变量的内存会被自动释放。 - **堆上创建**:使用`new`创建的对象,这些对象在堆中创建,由垃圾回收器管理其生命...

    Java垃圾回收机制.pdf

    在C++中,对象的生命周期与其作用域紧密相关,当对象超出作用域时会被自动销毁。而在Java中,对象的生命周期与其引用有关。只要存在至少一个引用指向对象,那么对象就不会被垃圾回收。当对象的引用计数变为0,即...

    飞加Java学习笔记_垃圾回收

    例如,在上述代码的`makeComputer()`方法中创建的`tempComputer`对象,一旦方法返回,`tempComputer`变量就离开了其作用域,意味着其指向的对象失去所有引用,等待垃圾回收。 总之,Java的垃圾回收机制是其内存管理...

    Java垃圾回收机制扫描.pdf

    然而,`finalize()`的调用时机并不固定,它会在垃圾回收器准备释放对象内存时被调用,而不是像C++析构函数那样在对象离开作用域时调用。因此,`finalize()`不应被依赖来保证资源的释放,因为它的时间点无法准确预知...

    基于java变量和作用域以及成员变量的默认初始化(详解)

    基于java变量和作用域以及成员变量的默认初始化 Java 变量和作用域是 Java 编程语言的基础概念,了解变量和作用域的概念对编写高效、可靠的 Java 程序非常重要。本文将详细介绍 Java 变量和作用域,以及成员变量的...

    垃圾回收机制.docx

    在例1中,`computer3`在`null`赋值后,虽然仍有可能通过其他引用访问,但由于直接引用`computer3`的变量被设置为`null`,这个对象也就离开了它的直接作用域,满足了垃圾回收的条件。但是,如果`computer1`也被设置为...

    2022年Java堆的管理--垃圾回收Java教程.docx

    当对象出了作用域后(该对象丢弃不再运用),引用计数器减1,一旦引用计数器为0,对象就满意了垃圾收集的条件。 基于tracing算法的垃圾收集器 tracing算法是为了解决引用计数法的问题而提出,它运用了根集的概念。...

    Java变量类型常见面试题及答案

    Java变量类型是编程基础,也是面试中经常被问到的话题。理解这些概念对于任何Java开发者都至关重要。在Java中,变量分为两类:基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。 一、...

    8.java变量.zip

    在Java中,变量声明会被提升到其所在作用域的顶部,这意味着在实际声明之前可以使用变量。然而,如果在使用前未初始化,会抛出编译错误。 7. **变量的命名规则** - 变量名应以字母、下划线(_)或美元符号($)...

    Java成员变量类变量局部变量的区别共5页.pdf.zip

    它们的生命周期与对象的生命周期相同,当对象被垃圾回收时,成员变量也随之消失。 类变量(静态变量)是用static关键字修饰的变量,它属于类本身而不是类的实例。这意味着不论创建多少个类的对象,类变量只有一份...

    7、垃圾回收与JAVA运行过程.pdf

    然而,当方法结束返回时,`oa[0]`的作用域也结束,此时对象才符合垃圾回收的条件。因此,答案是D,对象在该方法中永远不会被回收。 第三个例子与第二个类似,对象在第3行创建,然后在第6行`o`被设置为`null`。但...

    java变量的五种方式t共2页.pdf.zip

    在这个文档“java变量的五种方式t共2页.pdf.zip”中,我们预计会涵盖Java中的五种主要的变量类型及其用法。尽管实际内容无法在当前环境中直接查看,但根据常规的Java教程,我可以提供一个详细的概述。 1. **基本...

    浅谈Java中的变量.pdf

    本文主要讨论了Java中变量使用时的几个关键方面,包括变量的类型、作用域、值和生存期,并探讨了这些因素在Java虚拟机(JVM)中的实现机制。 1. **变量的类型**: Java中的变量分为两种类型:基本类型和引用类型。...

Global site tag (gtag.js) - Google Analytics