Java源代码经Javac命令编译以后,会生成.class的字节码文件。执行了Java命令之后,ClassLoader(类加载器)会将.class的字节码文件加载到内存中存储在方法区中。然后,JVM会调用main方法,顺次的执行代码,将局部变量存储在栈区中;将引用变量的所指向的内容,存储在堆区中,引用变量所指向的内容,用来存储hashCode码。顺次的执行,直到main方法执行完毕,然后再通过类加载器,将.class文件内容在JVM所占用的空间全部卸载。
Java执行过程示意图:
方法区:用来存储代码。将.class的字节码文件加载到内存中,并存储在方法区。静态域(静态块、静态属性、静态方法)也存储在方法区。
栈区:用来存储局部变量、形参、方法的返回值、中间的运算表结果。
栈的特点:1、先进后出;2、自动弹栈。
堆区:用来存储成员变量(属性)、数据的对象、方法的引用。
堆的特点:1、由双链表实现;2、用户不能直接访问;3、堆区的数据不能自动回收。
本地方法区:存储链接本地方法的相关代码(加native关键字的代码)。