本文共 1312 字,大约阅读时间需要 4 分钟。
/** * 从JVM调用的角度分析Java程序对内存空间的使用 * 当JVM进程启动 的时候,会从类加载路径中找到包含main方法的入口类HelloJVM * 找到HelloJVM后会直接读取该文件中的二进制数据并且把该类的信息放到运行的Method内存区域中 * 然后会定位HelloJVM的main方法的字节码中并开始执行main方法的 指令。 * Student student = new Student("xlj"); * 此时会创建Student实例对象,并且使用student来引用该对象(或者对该对象命名),其内幕对象如下: * 第一步:JVM会直接到Method区域中去查找Student类的信息,此时会发现没有Student类 * 就通过类加载器加载Student类文件; * 第二步:在JVM的method区域加载并找到了Student类之后会在heap区域中会为Student实例对象分配内存 * 并且在Student的实例对象中持有指向方法区域中的Student类的应用(内存地址) * 第三步:JVM实例完成后会在当前线程中为Stack的refrence建立实际的引用关系,此时会赋值给student * * 在JVM中方法的调用一定是属于线程的行为,就是说方法调用本身会发生在调用线程的方法调用栈中: * 线程的方法调用栈(Method Stack Frames),每个方法的调用就是方法调用栈中的一个Frame,该Frame包含了 * 方法的参数、局部变量、 临时数据等 * student.sayHello() * */public class HelloJVM { /*** * 在JVM运行的时候,会通过反射的方式到Method区域找到入口类的入口方法main * @param args */ public static void main(String[] args) { //main方法也是放在方法区域中 /** * student是放在主线程中的stack区域的 * Student对象实例是放在所有线程共享的Heap区域中的。 */ Student student = new Student("xlj"); /** * 首先会通过student指针(句柄)找Student对象,当找到该对象后,会通过对象内部指向方法区域中 * 的指针来调用具体的方法来执行任务。 */ student.sayHello(); }}class Student{ private String name; //name本身作为成员是放在Stack区域的,但是name执行的String对象是放在Heap中 public Student(String name) { this.name = name; } public void sayHello() { //sayHello是放在方法区域的 System.out.println("Hello this is "+this.name); }}
转载地址:http://ybooz.baihongyu.com/