当启动一个java程序时,同时也启动了java虚拟机,程序关闭退出时,java虚拟机也就消亡了,如果同时运行多个java程序就得到了多个虚拟机实例,每个java程序运行在它自己的java虚拟机实例中。

java虚拟机实例是通过调用某个初始类的main()来运行一个java程序,而这个main()方法必须是public static并且返回值是void,接受一个字符串数组作为参数。任何一个拥有这样的main()方法的类都可作为java程序运行的起点。

java程序初始类中的main()方法,将作为该程序初始线程的起点,其他任何线程都是由这个初始线程启动的。java虚拟机有两种线程:守护线程和非守护线程。只要还有任何非守护线程在运行,java程序也继续运行(虚拟机存活)。



java虚拟机启动器打不开 java虚拟机重启_java虚拟机

当java虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息,然后把这些类型信息放到方法区中。当程序运行时,虚拟机会把该程序在运行时创建的对象都放到堆中。当每一个新线程被创建时,它都将得到它自己的PC寄存器以及一个java栈。java栈中总是存储该线程中java方法(非本地方法)调用的状态--包括它的局部变量,被调用时传进来的参数,它的返回值以及运算中间结果等。(java栈是由许多栈帧组成,一个栈帧包含一个java方法调用状态)



java虚拟机启动器打不开 java虚拟机重启_虚拟机_02

java虚拟机中最基本的数据单元就是字(word),它的大小是由每个虚拟机设计者所决定。(至少得选择32位作为字长或选择更为高效的字长,一般根据底层主机平台的指针长度来选择字长)。


类装载器

类装载器负责查找并装载类型,有启动类装载器和用户自定义类装载器。类装载器子系统除了要定位和导入二进制class文件外,还必须负责验证被导入类的正确性,为类变量分配并初始化内存,以及帮助解析符号引用。

每个java虚拟机实现必须保证ClassLoader类的:
1.defineClass()方法能把新类型导入到方法区中;
2.findSystemClass()方法能调用系统类装载器返回对class对象的引用。
3.resolveClass()方法能让类装载器子系统执行连接动作。


方法区

对于每个装载的类型,虚拟机都会在方法区中存储以下类型信息:
1.全限定名;
2.这个类型的直接超类的全限定名;
3.这个类型是类类型还是接口类型;
4.访问修饰符;
5.任何直接超接口的全限定名的有序列表;
6.该类型的常量池;
7.字段信息;
8.方法信息;
9.除了常量以外的所有类(静态)变量;
        10.一个到类ClassLoader的引用;
11.一个到Class类的引用。