新手Java开发,探究比较浅,只是记录学习, 如果对您有帮助,荣幸之至。如有大佬,请指教
JVM运行机制
通过javac编译java文件,生成.class字节码文件
javap -c -p JvmDemo.class查看运行过程
javac JvmDemo.java
javap -c -p JvmDemo.class
PS H:\JavaPe> javac JvmDemo.java
PS H:\JavaPe> javap -c -p JvmDemo.class
Compiled from "JvmDemo.java"
public class Test.JvmDemo {
public Test.JvmDemo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList."<init>":()V
7: astore_1
8: iconst_0
9: istore_2
10: iload_2
11: bipush 100
13: if_icmpge 54
16: iload_2
17: iconst_2
18: irem
19: ifne 48
22: aload_1
23: new #4 // class java/lang/StringBuilder
26: dup
27: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
30: ldc #6 // String 插入了
32: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
35: iload_2
36: invokevirtual #8 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
39: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
42: invokeinterface #10, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
47: pop
48: iinc 2, 1
51: goto 10
54: return
这里的行号和Eclipse之类的程序工具上的不是同一个,这里的是JVM运行时,从上至下运行。
什么是内存模型
任何Java项目写好后,主体都是一个个的类文件,这些文件会被JVM运行,因此这些文件中的各项信息都会存放在JVM的内存中,如何保存就设涉及到了JVM内存模型了。
程序计数器(线程私有)
程序计数器是JVM记录当前线程所执行的字节码文件的行号指示器(即上面提到的行号)。选择语句、循环语句、各种逻辑判断都是由程序计数器来搞定。
Java虚拟机栈(线程私有)
用于存放局部变量
每个方法被执行的时候,都会在这个栈上创建一个栈帧,这个栈帧中用于存放 局部变量 表。每一个方法被调用,直到执行完成,就是一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量都是线程安全的,全局变量可能会产生多线程时安全问题
本地方法栈(线程私有)
Java虚拟机栈处理的是java方法,本地方法栈处理的是Native方法(C/C++编写的),属于底层方法。
Java堆(线程共享)
堆的主要目的就是存放对象的实例。应该是虚拟机内存中最大的一块,被所有线程共享。在虚拟机启动时就会被创建,是GC管理的主要区域,也被称为"GC"堆。
方法区(线程共享)
存储已被虚拟机加载的类的相关信息、常量、静态变量
运行时常量池
属于方法区的一部分。常量,用于存放编译时产生的各种字面量和符号引用,这一系列内容会在类加载后放在方法区的运行时常量池中。
例子
Student stu = new Student();
/*
*其中 stu 存放在栈中
*/