Java内存使用
1.栈内存:用于存放在函数中定义的一些基本类型的变量和对象的引用变量。当超过该变量的作用域时,java会自动释放为该变量分配的内存空间,该内存空间将被另作他用。
2.堆内存:用于存放由new
创建的对象和数组。在堆中由new
创建的对象和数组是由栈中定义的引用变量来指向的,引用变量的取值为该数组或对象在堆内存中的首地址。引用变量在程序运行到其作用域外后被释放,此时堆中的数组和对象在没有引用变量指向它时,进而变成垃圾。
垃圾收集器System. gc()
当一个对象变成垃圾后,垃圾回收器会在其后的某一个时刻启用,回收这些堆内存垃圾所占用的空间,但其启用的时间不由程序员控制,也无规律可循,并不会一产生了垃圾,它就被唤起,甚至有可能到程序终止,它都没有启动的机会。因此这并不是一个很可靠的机制。
我们也可以在任何时候在程序中通过调用System. gc()
方法来显式地运行垃圾回收程序。
比如,在创建大量垃圾的代码之后或者在需要大量内存代码之前运行垃圾回收器,来清除那些在内存中不再被引用的对象。
撤销方法finalize
在一个对象得到垃圾回收之前(无论是显式回收还是自动回收),垃圾收集器给对象一个机会来调用自己的finalize
方法,这个过程称为对象的撤销方法。finalize
方法是Object
类的一个方法,任何一个对象可以自动通过类的继承使用该方法,在当成垃圾对象被回收之前都会调用这个方法。
例
public class Person
{
String name;
int age;
public Person(String name)
{
this.name=name;
}
public Person(String name,int age)
{
this(name);
this.age=age;
}
public String getName(){
return this.name;
}
public void finalize()
{
System.out.println("the object "+this.getName()+" is going!"); //finalize
}
public static void main(String args[]) {
Person p1=new Person("Tom");
p1=null;
new Person("Mike");
new Person("Jerry");
System.gc(); //static
for(int i=0;i<10000;i++)
{}
System.out.println("the program is ending!");
}
}