1:JVM通过jvm.cfg文件夹中的jvm.dll文件初始化虚拟机。
2:初始化成功以后会得到一个JNI接口指向本地class文件物理位置。
3:将程序中例如监听器,spring配置的ioc,main函数等类加载。
4:在加载的时候首先将常量和静态变量存放进方法区,类的信息例如类名,方法名,全限定名放入方法区的运行时常量池。
基本数据类型放入方法栈中。
5:在碰到new关键字的时候,首先去方法区查找是否存在此对象的信息,如果存在就证明这个对象被虚拟机加载过,为了保证数据一致性首先要去方法栈中找到该对象的引用(全限定名),然后通过此引用在堆中去找到它并且销毁,之后按照对应的内存分配方式来分配内存,“指针碰撞”或者“空闲列表”,采用哪种内存分配方式取决于GC是否具备整理功能。在堆中分配内存成功以后,在方法栈中创建对象引用,将对象本身的属性放入方法区。并且分配指针指向堆中内存地址,引用方式为“直接引用”和“句柄引用”取决于虚拟机配置。
(此处,对象中的string存放在哪里?理论来说常量应该是放在方法区的把,此处比较特殊是放在堆中。)
6:继续执行,在对象引用以后会回收方法栈中指针,准备堆中引用的对象GC。
以上是最近对于虚拟机一个简单的理解,希望大家可以指正。