您的位置:首页 > 编程语言 > Java开发

java运行内存结构

2015-08-08 15:44 357 查看
内存空间逻辑划分: 
JVM会把申请的内存从逻辑上划分为三个区域,即:方法区、栈与堆。
 1.方法区:方法区物理上存在于堆里,方法区默认最大容量为64M,由类信息、static变量、常量池等组成

        类信息:java虚拟机会将加载的java类存入方法区,保存类的信息(类的代码信息),包括成员变量和方法等  

        常量池:常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据,其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间。编译器将源程序编译成class文件后,会用一部分字节分类存储这些粗体代码。而这些字节我们就称为常量池。事实上,只有JVM加载class后,在方法区中为它们开辟空 间才更像一个“池”

        static变量:包括static修饰的变量和方法

 2.堆(内存空间不连续):默认最大容量为64M,堆存放对象持有的数据,同时保持对原类的引用,存放new出的对象,对象调用的方法保存在方法区

 3.栈(自动分配连续空间,后进先出):默认最大容量为1M,在程序运行时,每当遇到方法调用时,java虚拟机就会在栈中划分一块内存称为栈帧(Stack frame),栈帧中的内存的局部变量(包括基本类型与引用类型)使用,当方法调用结束后,java虚拟机会收回此栈帧占用的内存

package cn.sina.kingther;

public class Student {

private String name;
private int id;
private String add1 = new String("哈尔滨");
private String add2 ="哈尔滨";
private static int n=3;

public static void study1(){
System.out.println(n--);
}
public void study2(){
System.out.println(name+"同学的学号是"+id+",他在"+add1+"上学"+n--);
}
public void study3(){
System.out.println(name+"同学的学号是"+id+",他在"+add2+"上学"+n--);
}

public static void main(String[] args) {
Student.study1();

Student st1 =new Student();
st1.name = "wangbaojia1";
st1.id =1;
st1.study2();

Student st2 =new Student();
st2.name = "wangbaojia2";
st2.id =2;
st2.study3();

System.out.println(st1.add1.equals(st2.add2));
System.out.println(st1.add1==st2.add2);
}

}
运行结果:3
wangbaojia1同学的学号是1,他在哈尔滨上学2
wangbaojia2同学的学号是2,他在哈尔滨上学1
true
false
内存效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息