JVM学习之路(大白话讲解)
1,当我们运行程序时,程序运行的整个过程
首先我们编写的java类通过javac命令将java文件编译成class字节码文件,然后通过类装载子系统将class文件装载到java虚拟机内存模型中,然后通过通过字节码执行引擎去执行内存模型中的字节码。
2,内存模型中的栈
(1)栈主要来存放程序中的局部变量。每当一个线程运行时,就会在栈中为当前线程开辟一块儿内存空间用来存放局部变量。如果还有其他线程,则会在栈中再为其他线程开辟内存空间。为每个线程开辟的内存空间为该线程独有。(先进后出)
(2)栈内部的结构
栈帧:一个方法对应一块栈帧内存区域(也就是当某个线程执行一个方法时,会在该线程栈的内存空间再为方法开辟一 小块内存空间来存放自己方法内的局部变量,这也是为什么在一个方法内定义的局部变量不能被别的方法访问的原因。 一 个方法对应一个栈帧。如图:(2-1)
(2-1) (2-2)
(3)栈帧内部的结构(如图:2-2)
局部变量:主要来存放程序方法中的局部变量(这个应该不用说),局部变量也包括对象的地址值(指针),会根据该 指针找到在堆里对应的对象
操作数栈:内部的数据结构也是个栈(先进后出),程序在运行的过程中存放那些操作数的临时的内存空间
动态链接:
方法出口:也就是当方法执行过程中调用别的方法,当别的方法执行完成之后需要回到调用别的方法的下一行,而这些 信息存放在方法出口。
3,程序计数器(jvm还会为每个线程分配一个程序计数器,字节码执行引擎会修改程序计数器标识的位置)
程序计数器的作用:每个线程执行的过程中都会有一个计数器来标识当前线程执行的位置。假如别的线程抢占了资源,则该线程挂起,当别的线程执行完成之后,该线程拿到资源后会从程序计数器标记的位置开始执行程序。
4,方法区
方法区存放一些类信息,常量,静态变量(也可能存放对象的地址值(指针),根据指针也可以找对堆里对应的对象)
未完,持续更新中。。。。。。。。。。
说明:本人在学习过程做根据自己的理解所编写,如果错误还希望大佬指正,互相学习