Java如何管理内存中的变量

时间:2015-04-18 19:37:10

标签: java variables memory

我们说我有这段代码:

{
    int var = 2;
    // more code
}

' var'会发生什么?代码执行后不再使用?它是从内存中删除还是留在那里占用内存或其他东西?

与此相关,是否更好地处理变量^,或者创建一些全局变量并只改变它的值?

4 个答案:

答案 0 :(得分:3)

局部变量存在于堆栈中。如果它是对象的引用,那么只有变量在堆栈上。

实例变量存在于堆上,因为它们属于一个对象。

此外this post java中的堆栈和堆内存)可能会有所帮助。

答案 1 :(得分:0)

总而言之,在java(和其他JVM语言)中,您根本不必关心内存分配和处理。你真的不应该担心它。一旦你失去了对该变量的引用(在这种情况下,当方法调用结束时),变量实际上就消失了。在此之后的一段无限时间内,垃圾收集线程将注意到您不再可能访问该变量,并释放它正在使用的内存。  见:Garbage Collection in Java

答案 2 :(得分:0)

如果要将任何变量定义为实例变量,则该变量将由实例使用。实例将保存在堆内存区域中。 垃圾收集器将定期运行以从内存中清除未引用的对象。

但是如果在任何块或方法中定义了该变量,那么将存储堆栈内存。

Java Stack内存用于执行线程。它们包含特定于方法的特定值,以及对从该方法引用的堆中其他对象的引用。堆栈存储器始终以LIFO(后进先出)顺序引用。每当调用一个方法时,都会在堆栈内存中创建一个新块,以便该方法保存本地原始值并引用该方法中的其他对象。一旦方法结束,该块就会被取用,并可用于下一个方法。

答案 3 :(得分:0)

当不再引用Java时,Java中的所有内容都将从内存中删除。 It takes a lot of effort to cause true memory leaks in Java.
像int,boolean和char这样的Java原语放在堆栈中,一旦离开作用域,就会从内存中删除。像String,数组或ArrayList这样的Java对象在堆上分配(并由堆栈上的局部变量引用)。当不再引用对象时,对象被垃圾收集(从内存中删除)。静态变量属于一个类,只要加载了类就会引用一个对象,这通常是整个运行Java程序的时间。静态是Java对全局变量最接近的事情,但过度使用或滥用静态实际上是导致内存问题而不是解决它们的一种方法。