JVM内部结构

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外的人想进去,
墙里面的人却想出来。
1
2
—Java程序是怎样被运行起来的

各个区域的概述:
1.类存放在方法区;
2.类创建的对象在堆中;
3.堆中对象调用方法时,会使用到虚拟机栈、本地方法栈、程序计数器;
4.方法执行时每行代码由解释器逐行执行;
5.热点代码由JIT编译器即时编译;
6.垃圾回收机制回收堆中资源;
7.和操作系统打交道需要调用本地方法接口。

程序计数器:(线程私有)JVM中的一小块内存

一行JVM指令----->解释器----->机器码----->CPU

在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪了。

虚拟机栈:(线程私有)
栈:线程运行需要的内存空间。
栈帧:每一个方法运行需要的内存(包括局部变量表、操作数栈,动态链接,方法出口,返回地址等信息)
局部变量表:存储的是各种编译器已知的各种基本数据类型,对象引用等,程序员更多情况下关注的是虚拟机栈中的局部变量表,局部变量表所需的内存空间在编译时期完成分配,在方法运行期间不会不会更改。

存储的东西:8大基本数据类型的变量,对象的引用,实例方法;

当我们的方法被调用的时候,就会进栈,当我们的方法执行结束的时候,就会出栈,其中main方法是第一个进栈的方法,栈是一种先进先出的数据结构,所以main方法也是最后出栈,最后执行结束的方法。
当我们的main方法调用其他方法的时候,其他方法也会以次进栈,如果存在死循环进栈,则会抛出栈溢出的错误信息。

本地方法栈:(线程私有)
与Java虚拟机的作用类似,Java虚拟机栈为虚拟机执行Java方法(也就是Java方法编译生成的字节码),本地方法栈是虚拟机中使用到Native方法服务的。

堆:(线程共享)
目的:存放实例对象。
通过new关键字创建的对象,都在堆内存上。
堆中有垃圾回收机制
堆内存溢出:死循环创建对象。
Java堆物理上可以处于不连续的内存空间,但在逻辑上它应该被视为连续的。

方法区:(线程共享)
方法区:用来存储已被虚拟机加载的类型信息(包括类的名称、方法信息、字段信息),常量,静态变量,即时编译器编译后的代码缓存等数据。

1.6和1.8版本方法区的位置不同。

在这里插入图片描述

posted @ 2021-03-28 15:15  诗人谈远方  阅读(75)  评论(0)    收藏  举报