java的内存管理机制

前言

对于java语言而言,将内存交给虚拟机管理,是一大特性,理解java内存管理机制,也是了解后续gc等的基础。

大部分情况下,我们只关注内存中的堆和栈,这是一个简单的划分,实际会更为复杂,作为java的开发从业者,应该要理清细节。

java的内存管理机制_第1张图片
image.png

数据运行区域

  • 1.程序计数器
    程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在学汇编的时候,我们了解到,下一步执行到哪一行,都是需要进行记录的,这个计数器就是负责来选取下一条需要执行的字节码指令,分支、 循环、 跳转、 异常处理、 线程恢复的。所以这个程序计数器是“线程私有”的内存

  • Java虚拟机栈
    这个我们最熟悉的栈,生命周期和线程相同。每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、 操作数栈、 动态链接、 方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
    我们最关注的是里面的局部变量表,里面放了基础类型和对象的引用。
    当你用递归等方式时,可能会导致栈空间不足,报stackOverFlowError,但现在大部分虚拟机支持动态栈扩容技术,如果无法扩容,则报OutOfMemoryError

  • 本地方法栈
    类似于虚拟机栈,区别在于它执行的是虚拟机用到的Native方法服务。

  • Java堆
    Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,用途是为了存放对象实例。
    java堆也是垃圾收集器管理的主要区域,根据GC来分,可以进行分代。

  • 方法区
    各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据。不同的虚拟机对于方法区的实现是不一样的,但新架构应该是往独立的方法区去进行设计。
    里面会有一些常量池等,常量池就是一些final修饰的,不可变的常量,主要有字面量和引用量

  • 直接内存
    仅做了解,java在NIO类,可以对堆外内存进行操作。

你可能感兴趣的:(java的内存管理机制)