(01)JVM-内存三大核心区域以及分析
package org.burning.sport.jvm; /** * 从JVM调用的角度分析Java程序对内存空间的使用, * 当JVM进程启动的时候,会从类加载器路径中找到包含main方法的入口类HelloJVM * 找到HelloJVM后会直接读取该文件中的二进制数据并且把该类的信息放到Method内存区域中 * 然后会定为HelloJVM中的main方法的字节码中并开始执行main方法中的指令 * Student student = new Student("张三"); * 此时会创建Student实例对象并且使用student来为该对象命名,其步骤如下: * 步骤一:JVM会直接到Method区域中去查找Student类的信息,此时发现没有Student类,就通过类加载器加载该Student类文件 * 步骤二:在JVM的Method区域加载并找到了Student类之后会在Heap区域中为Student实例对象分配内存并且在 * Student的实例对象中持有指向方法区域中的Student类的引用(内存地址) * 步骤三:JVM实例完后会在当前线程中为Stack中的reference建立实际的引用关系,此时会赋值给student * * 在JVM中方法的调用一定是属于线程的行为,也就是说方法调用本身会发生在调用线程的方法调用栈: * 线程的方法调用栈(Method Stack Frames),每一个方法的调用就是方法调用栈中的一个Frame,该Frame包含了 * 方法的参数、局部变量、临时数据等 * student.sayHello(); * @ProjectName: base-project * @Description: * @author: lisen * @date: 2018/4/15 */ public class HelloJVM { // JVM运行的时候会通过反射的方式到Method区域找到入口类的入口方法main() public static void main(String[] args) { // student是放在主线程的Stack区域中的 //Student对象实例是放在所有线程共享的Heap区域中的 Student student = new Student("张三"); //首先会通过student指针(句柄)找到Student对象,当找到该对象后 //会通过对象内部指向方法区域中的指针来调用具体的方法去执行任务 student.sayHello(); } } class Student { private String name; public Student(String name) { this.name = name; } // sayHello()这个方法是放在方法区的 public void sayHello() { System.out.println("Hello, this is " + name); } }
参考: