java的内存分为四种:本地方法区、方法区、堆内存和栈内存
本地方法区是java虚拟机使用的内存空间,一般的程序员不需要操作这些内存空间,所以这里不做讨论。
方法区是存放类信息的内存空间,在类被加载的时候就为类分配了类需要的空间,用来存储类的属性和方法。其中静态属性和静态方法都是只存放在方法区里面,类的所有实例都会共享这些静态属性和静态方法。
堆内存:堆内存用来存放类对象信息,当程序实例化一个对象之后,就会为该对象分配一个存储空间来储存对象的属性和方法,当然,这些属性和方法是不包括静态属性和静态方法的。
栈内存:栈内存是用来存放对象的应用数据的。并且长期不适用的应用数据会被自动弹出,所以,栈内存是不需要使用java的垃圾回收机制的。
举例说明:
public class person{
String name;
int age;
String sex;
person(String name,String sex,int age){
system.ut.println(name+sex+age);
}
public void static main(String [] args){
String name = "张三";
int age = 11;
String sex ="男";
person p = new pserson(name,sex,age);
}
}
类被java虚拟机加载的时候,就会为这个person类分配一个方法区,在这个内存块里面,存放有方法和属性信息,静态数据还记录有数据的值,非静态属性只是记录了属性的数据类型和属性的名称,一边将来实例化对象的时候使用这些信息。静态方法,包括主方法也是这个时候被加载到方法区中的。
然后java虚拟机调用类的主方法,首先又在内存中划出了一个栈内存,用来存放应用数据,这个例子中存放有name,age,sex和p1等应用数据。在最后就引用数据的值张三,11,男,以及person的对象数据存储在堆内存中,并且还将这些数据存放的内存地址值赋值给相应的应用数据。