由浅入深了解JVM-内存结构

前言

作为一名java工程师,无论如何都得对JVM有一定的了解,如果在互联网公司,尤其像BATM这样的大厂,如果想在技术上有一定的造诣那么对JVM就得有非常深入的了解,但作为一名普通的java工程师个人觉得最起码需要知道JVM内存结构(运行时数据区)由哪些模块组成,以及每个模块的作用。这里笔者是这样记得:三黄两绿,即五个模块。“黄”表示是线程私有的,只有自己能看的见。“绿”表示是大家都能用的,共享的。配合下图以及这四个字,JVM的内存结构就算掌握了。

结构

其中黄色区域,即线程私有的三个模块分别为:虚拟机栈,本地方法栈,程序计算数器。
绿色区域,即所谓的线程共享模块:方法区和堆。
在这里插入图片描述

功能

这里对五个模块作简要介绍,后续博客会针对每个模块作详细介绍。

jvm 中 堆占用的内存最大,它的作用就是用于存放对象,几乎所有的对象都分配中堆中。jvm中涉及到垃圾回收也主要作用于堆,因此也经常称作GC堆(Garbage Collected Heap)。特性:线程共享,空间不足时会抛OutOfMemoryError异常

方法区

与堆一样,它的作用是用于加载类信息、常量、静态变量以及即时编译器编译后的代码等信息。部分垃圾回收工作也会在方法区进行,但是效果不是那么太明显。特性:线程共享,无法扩展时同样会抛OutOfMemoryError异常

程序计数器

从硬件的角度来说,它是一个寄存器,当然在jvm中它是被虚拟化出来的一个寄存器,它的寄存功能是用来寄存当前线程所执行的字节码的行号。特性:占用内存较小,线程私有,不会抛OutOfMemoryError异常,可以理解成只需要暂存一个整数。

虚拟机栈

说到栈顾名思义就是一种数据结构,先进后出,用于存储方法调用和方法执行的信息。例如局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈在虚拟机栈里从入栈到出栈的过程。特性:线程私有,如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常,如果无法扩展时会抛OutOfMemoryError异常。

本地方法栈

同样是一种栈,但此栈不是用来处理java的方法调用等行为,而是用于处理本地的方法,例如在java中调用了其他的语言的方法,这些方法的调用就会交给本地方法栈来处理。特性与虚拟机栈类似:线程私有,也会抛出StackOverFlowError和OutOfMemoryError异常。

至此,jvm的内存结构介绍完了,至于每个模块的工作原理请参考如下博文(持续更新中):
由浅入深了解JVM-堆
由浅入深了解JVM-虚拟机栈
由浅入深了解JVM-程序计数器

猜你喜欢

转载自blog.csdn.net/hongyinanhai00/article/details/113732667