JAVA面试之JVM Java内存模型简介

内存简介:

计算机所有程序都是在内存中运行的,在程序执行过程中,要不停的将内存的逻辑地址和物理地址进行映射,找到相关的指令以及数据去执行。

 

地址空间划分为内核空间、用户空间

 

Java内存模型

 

 

程序计数器

 

虚拟机栈

 

JAVA虚拟机栈是JAVA方法执行的内存模型,包括多个栈帧,每个栈帧包括局部变量表,操作栈,动态连接,返回地址等。

当线程执行一个方法时,就会创建一个栈帧,并将这个栈帧压入虚拟机栈中,当方法执行完毕时,便会将栈帧出栈,因此线程当前执行的方法栈帧必定处于虚拟机栈顶部。

虚拟机栈是由java虚拟机自动管理的,栈类似一个集合,但是它是有固定的容量的,是由多个栈帧组合的,每一个方法执行,Java虚拟机就会在内存中分配一块空间,这块空间就是栈帧。当方法结束后,对应的栈帧就会被自动释放掉。栈的内存是不需要通过GC进行回收的,会自动释放。

 

举例:

LineNumber:line 5:0 代码第五行,对应程序第0行 iconst_ 0

Istore代表将数据从操作数栈弹出,放到局部变量表中

Iload代表将数据从局部变量取出,放到操作数栈中

执行这个方法:

1 iconst_0 将0放到操作数栈中

2 Istore_2 出栈,放到局部变量表2的位置

3 Iload_0 将变量表0位置的数,放入操作数栈

4 Iload_1 将变量表1位置的数,放入操作数栈

5 Iadd 操作数栈做加法

6 Istore_2 出栈,放到局部变量表2的位置

7 Iload_2 将变量表2位置的数,放入操作数栈

 

当线程执行一个方法时,就会创建一个栈帧,并将这个栈帧压入虚拟机栈中,当方法执行完毕时,便会将栈帧出栈,因此线程当前执行的方法栈帧必定处于虚拟机栈顶部,而递归函数不断去调用自身,每调用一次方法就会新生成一个栈帧,当递归的深度大于虚拟栈深度时,就会报StackOverflowError。

解决这个错误,主要就是限制递归的次数,或者使用循环去替换递归。

当虚拟机栈可以动态扩展时,如果无法申请过多的内存,就会抛这个异常。

本地方法栈

MetaSpace元空间

在jdk8以后,将类的元数据放在本地堆内存中,这一块区域称为MetaSpace.在jdk7以前是永久代。

元空间(MetaSpace)与永久代(PermGen)的区别?

元空间使用本地内存,而永久代使用的是jvm的内存。解决了使用永久代时会出现的异常PermGen space问题。元空间不再受Jvm内存的限制,只受到本地内存的限制。

 

Java堆(Heap)

Java堆是java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时被创建。Java堆唯一的目的是存放对象实例,所有的对象实例都在这里分配内存。是GC管理的主要区域

Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的,即可。

发布了86 篇原创文章 · 获赞 0 · 访问量 4090

猜你喜欢

转载自blog.csdn.net/qq_31965925/article/details/105062626