
package JVM_app;
/**
* 从JVM调用的角度分析java程序对内存空间的使用;
* 当JVM进程启动的时候,会从类加载路径中找到包含main方法的入口类HelloJVM
* 找到之后会直接读取该文件中的二进制数据,并且把该类的信息放到运行时的Method内存区域中;
* 然后会定位到HelloJVM中的main方法的字节码中并开始执行main方法中指令:
* Student student = new Student("joker");
* 此时会创建Student实例对象并且使用student来应用该对象(或者说对该对象重命名),其内幕如下:
* 第一步:JVM会直接到Method区域中去查找Student类的信息,此时发现没有Student类,就通过
* 类加载器加载该Student类;
* 第二步:在JVM的Method区域加载并找到了Student类之后会在Heap区域中为Student实例对象分配内存
* 并且在Student的实例对象中持有指向方法区域中的Student类的应用(内存地址);
* 第三步:JVM实例完后,会在当前的线程中为stack中的referenc建立实际的应用关系,此时会赋值给student
*
* 在JVM中的方法的调用一定是属于线程的行为,也就是说方法调用本身会发生在调用线程的方法调用栈:
* 线程的方法调用栈(Method Stack Frames),每一个方法的调用就是方法调用栈中的一个frame,该
* frame包含了方法的参数、局部变量、临时数据等;student.sayHello();
* */
public classHello JVM {
/**
* 在JVM运行的时候会通过反射的方式找到Method区域找到入口类的入口方法main
*@paramargs
*/
public static void main(String args[]) {
/**
* student是放在主线程中的stack区域中的;
* Student对象实例是放在所有线程共享的Heap区域中的;
*/
Student student = new Student("joker");
/**
* 首先
*/
student.sayHello();
}
}
classStudent {
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);
}
}
网友评论