陆陆续续背了一些八股文把,但是具体细节一问就不知道了,关于jvm自己看了一些文章,也看来一些介绍视频,现在觉得可以来个分享。
jvm整体图示是这样的
我们可以知道new的东西在堆里面
栈里面放的是线程运行的变量(1个线程就对于一个栈),栈的但是是栈帧。
如图示,我们结合具体代码进行相关介绍。
比如int a=1;
我们先把1放在操作数栈里面
然后新建一个变量a放在局部变量里面,然后把操作数栈里面的1出栈,赋值给a,完成int a=1;
同理我们可以完成b=2
接下来c=a+b,我们拿到ab的值,通过加法运算得到3,把三先放在操作数栈,然后出栈,声明c局部变量,放在局部变量被,进行赋值。
但是其实我们每一个线程也有自己的程序计数器,里面保存的是下一次执行的位置。另外当线程被挂起后,恢复执行时候也会用到中国程序计数器。
程序计数器是怎么修改的呢?
是由字节码执行引擎在重新运行过程里面动态修改的
那么通过代码我们可以发现,在main函数里面还有一个对象,这个对象t1是局部变量,但是他的值我们是一个地址,因为new的一个地址放在堆里面
所以栈里面可能会有执行堆的引用。
动态链接其实就是把符号引用变成直接引用,但是这个引用可能是地址,同理,在进行方法的时候也可能有对象存在,所以方法区也可能引用堆里面的东西
方法出口,就是记录下一行执行的位置
本地方法栈:用关键字native修饰的代码放在本地方法栈。
方法区属于是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。当虚拟机要使用一个类时,它需要读取并解析 Class 文件获取相关信息,再将信息存入到方法区。方法区会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
栈、本地方法栈、重新计数器是私有的。堆、方法区是共享的