发布网友 发布时间:2022-05-29 17:42
共1个回答
热心网友 时间:2023-10-29 20:59
但是在一开始,我们考虑的只是这个语言是什么样的,我们如何更好的编码,却很少有人关心他内部是怎么运行的。看下面一个简单的hello world。packagecom.wordpress.kkarthikeyanblog;publicclassHelloWorld{publicstaticStringHELLOWORLD="HelloWorld";publicvoidprint(){System.out.println(HELLOWORLD);}publicstaticvoidmain(String[]args){HelloWorldhelloWorld=newHelloWorld();helloWorld.print();}}在使用javac工具编译了以上代码后,我使用下面的命令来运行这个程序。这时候JVM就启动了。在一开始,BoostrapperClassLoader 加载java.lang.package这个包,我内部的System Class Loader通过给定的classpath找到类"HelloWorld"。在定位到HelloWorld.class后,我将得到这个二进制流。然后我从这个class文件中提取出了一下信息。constants(例如文本、常数、类型、方法的符号引用)将被放到constant pool【在这个例子中包括HelloWorld class、方法、常量的符号】包、修饰符、静态变量【在这个例子中,"HELLOWORLD"这个静态变量】字段信息(名称、类型、修饰符)方法信息(名称、返回值类型、方法参数、修饰符、方法的字节码)【在这个例子中是print、void、public和字节码】ClassLoader的引用【装载这个类的classloader】引用class的类以上信息都被存在"Method Area"中。在装载完毕以上信息后,我(JVM)试着找出"public static void main(String [] args)"方法。我(JVM)中的每一个线程,除了共享"Method area"和"Heap Space"之外,他们还拥有自己的"stack"和"pc register"。然后在程序计数器的指引下,我开始执行下面这行:HelloWorldhelloWorld=newHelloWorld();我(JVM)将从constant pool中拿到HelloWorld的符号引用。然后查找Method area,获取到class信息,然后在Heap space中创建对象。现在程序计数器将会指到helloWorld.print();我(JVM)将从我自己的线程的stack中取出变量"helloworld"的引用,并且找到print()方法。在从Method Area中得到字节码信息后,我将方法"print()"压栈(push),现在我将开始执行print()方法。一旦print()方法执行结束,这个方法将出栈(pop up),将继续执行main()方法。一旦main()方法结束。main()方法将出栈,整个程序的执行也就结束了。总结一下以上所说,在JVM中:Method area-存放类信息Heap Space-只存放对象针对每一个线程来讲:Stack-包含一个一个的栈帧【例如方法栈】-它也存放指定方法的局部变量另外,除了这些,还有一个"Garbage Collector"(垃圾回收器)来释放那些无用的对象。最后,希望你看了此文能对JVM有更深一步的了解。