20201205jvm学习第2课_JVM 的内存管理划分以及栈上的执行过程)
1.JVM 是如何进行内存区域划分的?
2.JVM 如何高效进行内存管理?
3.为什么需要有元空间,它又涉及什么问题?
画出jvm的内存布局
JVM 内存区域划分如图所示,从图中我们可以看出:
JVM 堆中的数据是共享的,是占用内存最大的一块区域。
可以执行字节码的模块叫作执行引擎。
执行引擎在线程切换时怎么恢复?依靠的就是程序计数器。
程序计数器是用于存放下一条指令所在单元的地址的地方。
这就是他能恢复现场的原因,在多线程场景有用。
JVM 的内存划分与多线程是息息相关的。像我们程序中运行时用到的栈,以及本地方法栈,它们的维度都是线程。
本地内存包含元数据区和一些直接内存。
- 栈的执行过程
我们在上面提到,Java 虚拟机栈是基于线程的。哪怕你只有一个 main() 方法,也是以线程的方式运行的。在线程的生命周期中,参与计算的数据会频繁地入栈和出栈,栈的生命周期是和线程一样的。
栈里的每条数据,就是栈帧。在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦完成相应的调用,则出栈。所有的栈帧都出栈后,线程也就结束了。
堆是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆。
堆空间一般是程序启动时,就申请了,但是并不一定会全部使用。
随着对象的频繁创建,堆空间占用的越来越多,就需要不定期的对不再使用的对象进行回收。这个在 Java 中,就叫作 GC(Garbage Collection)。
4.一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?
这和两个方面有关:对象的类型和在 Java 类中存在的位置。
5.我们常说的“堆内存、栈内存”中的“栈内存”指的便是虚拟机栈,确切地说,指的是虚拟机栈的栈帧中的局部变量表,因为这里存放了一个方法的所有局部变量。
6.本地方法栈和java虚拟机栈异同
参考https://www.cnblogs.com/code-duck/p/13559193.html
相同点:功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。
不同点:本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,因此不同的虚拟机实可以进行自由实现,我们常用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈。 那还说个屁啊
7.哪些是线程私有? 程序计数器+ 2个栈(本地方法栈,java虚拟机栈)
哪些是程序共享的?堆空间和方法区
原文地址:https://blog.csdn.net/ademen/article/details/110707285
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!