jvm(java虚拟机)中的几个比较重要的内存区域(Java采用动态内存分配方式)。
方法区:又叫静态区,跟堆一样,被所有的线程共享。用于存储虚拟机已经加载的类信息、常量、静态变量和即时编译器编译后的方法代码。包含所有的class和static变量。
常量池:是方法区的一部分,主要用来存放常量和类中的符号引用等信息。
堆:线程共享的区域,存放对象实例,堆中不存放基本类型和对象引用。堆是垃圾收集器管理的主要区域。
栈:栈是存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。
即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序。
AppMain.java public class AppMain //运行时, jvm 把Appmain的信息都放入方法区 { public static void main(String[] args) //main 方法本身放入方法区。 { Sample test1 = new Sample( " 测试1 " ); //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面 Sample test2 = new Sample( " 测试2 " ); test1.printName(); test2.printName(); } } Sample.java public class Sample //运行时, jvm 把appmain的信息都放入方法区 { /** 范例名称 */ private name; //new Sample实例后, name 引用放入栈区里, name 对象放入堆里 /** 构造方法 */ public Sample(String name) { this .name = name; } /** 输出 */ public void printName() //print方法本身放入 方法区里。 { System.out.println(name); } }